为了账号安全,请及时绑定邮箱和手机立即绑定

Golang检查接口类型是否为nil

Golang检查接口类型是否为nil

Go
元芳怎么了 2022-01-17 17:53:40
在使用 Golang 的json.Unmarshal()函数解组 json 字符串时,我总是将字符串解组为map[string]interface{}-我不确定是否有更优化的解码 json 的方法。言归正传:有时 json 的未编组类型是nil, not string(或int等)。这总是引发恐慌,说:接口转换:interface 为 nil,而不是 int我怎样才能避免这种恐慌或检查接口的类型是否是nil?例子:这是我的问题的一个例子:https: //play.golang.org/p/0ATzXBbdoS
查看完整描述

1 回答

?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

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


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)

}


查看完整回答
反对 回复 2022-01-17
  • 1 回答
  • 0 关注
  • 186 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号