Golang检查接口类型是否为nil

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

言归正传:

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

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

我怎样才能避免这种恐慌或检查接口的类型是否是nil

例子:

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


元芳怎么了
浏览 187回答 1
1回答

米琪卡哇伊

检查密钥是否存在而不是让它恐慌。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))    }}此外,如果您知道 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)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go