首頁  >  文章  >  後端開發  >  為什麼 `json.Unmarshal` 會因指向原始類型的 Nil 指標而失敗?

為什麼 `json.Unmarshal` 會因指向原始類型的 Nil 指標而失敗?

DDD
DDD原創
2024-11-22 08:50:19599瀏覽

Why Does `json.Unmarshal` Fail with a Nil Pointer to Primitive Types?

解組 JSON:指標與引用

json.Unmarshal 函數允許我們將 JSON 資料轉換為 Go 結構體。雖然文件表明如果指標為零,它可以分配一個新值,但事實並非如此。

考慮以下範例:

var animals Animal

err := json.Unmarshal(jsonBlob, &animals)

這如預期工作,因為動物是非零指針。但是,如果我們將Animals 變更為未初始化的指標:

var animals *Animal

err := json.Unmarshal(jsonBlob, animals)

此操作會失敗,並顯示模糊的錯誤訊息:

json: Unmarshal(nil *main.Animal)

此錯誤源自於InvalidUnmarshalError,當無效時會拋出該錯誤參數傳遞給Unmarshal。文件沒有明確聲明指標必須為非 nil,這可能會導致混亂。

文件中的衝突引用顯示 Unmarshal 可以為 nil 指標指派新值,可能是指到 Reflect.New 函數的行為,Unmarshal 在內部使用該函數在指標為 nil 時建立新值。但是,reflect.New 僅適用於某些類型,例如結構和切片。它不適用於指向原始類型的指針,例如 *int 或 *string。

總之,json.Unmarshal 需要一個非 nil 指標作為其第二個參數。它不能為原始類型的 nil 指標指派新值。因此,在嘗試將 JSON 資料解組到其中之前,請確保指標不為 nil 非常重要。

以上是為什麼 `json.Unmarshal` 會因指向原始類型的 Nil 指標而失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn