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

时间:2016-09-08 22:35:48

标签: go

在这个函数中,我得到 " s声明但未使用" 我不明白 - 我是否需要以某种方式标记它因为'我真的用过它'还是什么?

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"}
}

奇怪的是,我没有从这个函数中得到错误:

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"}
}

此外,任何有关将这些因素纳入单一功能的正确方法的想法都会受到欢迎!

2 个答案:

答案 0 :(得分:1)

您的错误来自(声明而不是)在其他地方使用相同的标识符,因为这会在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
}

答案 1 :(得分:0)

您的代码看起来正确,错误无法重现。 当然你可以将它们重构成一个单独的功能,但你可能不喜欢它取决于口味。

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
    }
}