首頁  >  文章  >  後端開發  >  為什麼 `json.Unmarshal` 使用引用而不是指標?

為什麼 `json.Unmarshal` 使用引用而不是指標?

Barbara Streisand
Barbara Streisand原創
2024-11-12 04:57:01484瀏覽

Why Does `json.Unmarshal` Work with a Reference but Not a Pointer?

為什麼 Unmarshal 使用引用而不是指標?

為了提供此查詢的上下文,在 Go 中,json.Unmarshal 函數反序列化JSON 資料到所提供的引用指向的結構中。讓我們深入研究 Unmarshal 在兩個場景下的行為。

場景1:對結構體的引用

在第一個場景中,對結構體的非零引用是傳遞給Unmarshal,如以下程式碼片段所顯示:

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

這可以無縫運作。根據文檔,如果指針為 nil(初始化為零),Unmarshal 會分配一個新的結構值來指向。然而,在這種情況下,animals 已經初始化並指向一個有效的結構體,因此操作成功。

場景 2:指向結構體的指標

在此場景中,一個指向結構體的未初始化指標被傳遞給 Unmarshal。

var animals *Animal
err := json.Unmarshal(jsonBlob, animals)

結果在「無效參數」錯誤中:

json: Unmarshal(nil *main.Animal)

出現這種情況是因為文件不完全清楚。雖然它提到如果指標為nil,Unmarshal 會分配一個新結構,但它沒有明確聲明指標本身必須為非nil,如Unmarshal 原始碼中的以下註釋所示:

// An InvalidUnmarshalError describes an invalid argument passed to Unmarshal.
// (The argument to Unmarshal must be a non-nil pointer.)

因此,將未初始化的指標(Go 中預設為nil)傳遞給Unmarshal 會觸發此錯誤,因為它違反了非nil 指標的要求。要解決此問題,只需在呼叫 Unmarshal 之前將指標初始化為新結構即可。

「Unmarshaling」的拼寫

至於拼寫,「unmarshalling」和「unmarshaling」 是可接受的拼寫,根據Go 原始碼的grep,第二種在Go 程式碼中更常見程式碼庫。

以上是為什麼 `json.Unmarshal` 使用引用而不是指標?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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