Golang 检查接口类型是否为 nil

Aci*_*dic 5 json interface go

在使用 Golang 的json.Unmarshal()函数解组 json 字符串时,我总是将字符串解组为一个map[string]interface{}-我不确定天气是否有更佳的解码 json 方法。

进入正题:

有时 json 的解组类型是nil, not string(或int等)。这总是引起恐慌,说:

接口转换:接口为nil,不是int

如何避免这种恐慌或检查接口的类型是否正确nil

例子:

这是我的问题的示例:https : //play.golang.org/p/0ATzXBbdoS

T. *_*rie 5

检查密钥是否存在而不是让它恐慌。

func keyExists(decoded map[string]interface{}, key string) {
    val, ok := decoded[key]
    return ok && val != nil
}

func main() {

jsonText := `{
        "name": "Jimmy",
        "age":  23
    }`

    var decoded map[string]interface{}

    if err := json.Unmarshal([]byte(jsonText), &decoded); err != nil {
        fmt.Println(err)
        os.Exit(0)
    }

    if keyExists(decoded, "name") {
        fmt.Println(decoded["name"].(string))
    }
    if keyExists(decoded, "age") {
        fmt.Println(decoded["age"].(float64))
    }
    if keyExists(decoded, "gender") {
        fmt.Println(decoded["gender"].(int))
    }
}
Run Code Online (Sandbox Code Playgroud)

另外,如果您知道 json 的样子,这还远非最佳。正如文档中所指定的,您可以将其直接解组到结构中:

type Human struct {
    Name string
    Age int
    Gender int
}

func main() {
    jsonText := `{
        "name": "Jimmy",
        "age":  23
    }`

    decoded := Human{}

    if err := json.Unmarshal([]byte(jsonText), &decoded); err != nil {
        fmt.Println(err)
        os.Exit(0)
    }

    fmt.Println(decoded.Name)
    fmt.Println(decoded.Age)
    fmt.Println(decoded.Gender)
}
Run Code Online (Sandbox Code Playgroud)