為什麼 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中文網其他相關文章!