转到:var声明但未使用错误-如何解决?

In this function I get "s declared and not used" which I don't understand - do I need to somehow tag it as 'really I used it' or something?

func getString(data map[string]interface{}, name string) (string, error) {
    s := data[name]
    if reflect.TypeOf(s).Kind() != reflect.String {
        return s.(string), nil
    }
    return "", &apiError{1, "it's not a string"}
}

Oddly, I don't get the error from this function:

func getInt(data map[string]interface{}, name string) (int, error) {
    t := data[name]
    if reflect.TypeOf(t).Kind() == reflect.Int {
        return t.(int), nil
    }
    return 0, &apiError{1, "it's not an int"}
}

Also, any thoughts on the right way to factor these into a single function would be welcomed!

Your error comes from (declaring and not) using the same identifier elsewhere because this compiles and runs fine on golang.org:

package main

import "reflect"

func main() {
    m := make(map[string]interface{})
    m["foo"] = "25"
    getString(m, "foo")
}

func getString(data map[string]interface{}, name string) (string, error) {
    s := data[name]
    if reflect.TypeOf(s).Kind() != reflect.String {
        return s.(string), nil
    }
    return "", nil
}

Your code looks correct, error isn't reproducible. Sure you can refactor these into a single function, but you may not like it depending of tastes.

type VType int
const (
    VInteger VType = iota
    VString
    VUnknown
)
func getValue(data map[string]interface{}, name string) (VType, int, string) {
    switch v := data[name].(type) {
    case int:
        return VInteger, v, ""
    case string:
        return VString, 0, v
    default:
        return VUnknown, 0, ""
    }
}
func main() {
    m := make(map[string]interface{})
    m["foo"] = "25"
    switch t, i, s := getValue(m, "foo"); t {
    case VInteger:
        fmt.Println("int ", i)  //do something with int
    case VString:
        fmt.Println("string ", s) //do something with string
    case VUnknown:
        err := &apiError{1, "it's not an int"} //do something with err
    }
}