亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 182 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號