首頁 > 後端開發 > Golang > 為什麼「json.Unmarshal」與傳遞給 Go 中「interface{}」參數的指標和非指標值的行為不同?

為什麼「json.Unmarshal」與傳遞給 Go 中「interface{}」參數的指標和非指標值的行為不同?

Susan Sarandon
發布: 2024-12-15 20:38:15
原創
784 人瀏覽過

Why Does `json.Unmarshal` Behave Differently with Pointer and Non-Pointer Values Passed to an `interface{}` Parameter in Go?

Golang Interface{} 類型誤解

在Go 中使用interface{} 作為函數參數類型時,了解它是如何工作的非常了解重要影響json.Unmarshal 的使用。將非指標類型傳遞給介面{}參數可能會導致意外結果。

場景1:將非指標值傳遞給介面{}

中在給定的範例中,一個Test 結構體直接傳遞給測試函數,該函數需要一個interface{}參數:

test(Test{})
登入後複製

輸出顯示struct已被json.Unmarshal轉換為map[string]interface{}:

main.Test
*interface {}
map[string]interface {}
登入後複製

這是因為interface{}包裹了一個(value; type) 對,且傳遞的值是非指針,因此json 包會建立一個新值來解組。由於 JSON 物件的預設值是 map[string]interface{},因此這就是創建的內容。

場景2:傳遞一個指向Interface{} 的指標

傳遞一個然而,指向測試函數的Test 結構的指標會產生預期的結果:

test(&Test{})
登入後複製
*main.Test
*interface {}
*main.Test
&{bar}
登入後複製

這是因為指向結構體的指標被傳遞給json.Unmarshal,允許它直接解組到指向的 Test 值。

解釋:指標和介面

當套件需要修改儲存在interface{},它需要接收指向它的指標。對於 json.Unmarshal,它需要一個解組指標。當您有一個已包裝指標的 interface{} 值時,只需將其傳遞,而無需再次取得其位址。

最佳實務

避免使用指向介面的指標。相反,透過將指標包裝在介面值中,將指標放入介面中。當你需要傳遞一個持有指標的介面{}時,直接傳遞即可。

以上是為什麼「json.Unmarshal」與傳遞給 Go 中「interface{}」參數的指標和非指標值的行為不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板