【问题标题】:Golang check if interface type is nilGolang检查接口类型是否为nil
【发布时间】:2016-10-12 04:38:19
【问题描述】:

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

切入正题:

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

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

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

示例:

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

【问题讨论】:

    标签: json go interface


    【解决方案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)
    }
    

    【讨论】:

    • 我有一个关于定义结构并将 json 提取到其中的问题。如果我有一些 json 看起来像: { "name": "Jimmy", "traits": { "age": 23, "gender": 0 } } ... 我将如何定义值 "age" 和结构中的“性别”?这是您可以回答我的问题的基础:play.golang.org/p/TyXbrFAtGo
    • 创建一个嵌套结构Traits,其中包含agegender。另外,请阅读encoding/json 包的文档
    • 感谢您这么快的回复。对于任何感兴趣的人,这是我解决问题的方法:play.golang.org/p/mq5XL47msM
    猜你喜欢
    • 2012-11-15
    • 2014-08-20
    • 2013-08-02
    • 2016-10-15
    • 2021-11-16
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2015-04-11
    相关资源
    最近更新 更多