解組 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中文網其他相關文章!