首頁 >後端開發 >Golang >為什麼 Go 的 `interface{}` 類型會導致 `json.Unmarshal` 失敗?

為什麼 Go 的 `interface{}` 類型會導致 `json.Unmarshal` 失敗?

Patricia Arquette
Patricia Arquette原創
2024-12-04 14:24:12955瀏覽

Why Does `json.Unmarshal` Fail with Go's `interface{}` Type?

Golang interface{} 類型誤解

在 Go 中,interface{} 類型允許變數保存任何類型的值。但是,在使用 json.Unmarshal 時,使用 interface{} 作為函數參數類型可能會導致意外結果。

場景1:使用Unmarshal 的非指標類型

將非指標型別傳遞給interface{} 類型的函數參數時,json.Unmarshal 將無法解組為該值。相反,它會建立一個新的map[string]interface{} 值並將其儲存在interface{} 中。這是因為 json.Unmarshal 需要一個指標來解組到。

場景2:使用Unmarshal 的指針類型

如果傳遞的是指向值的指針,則json. Unmarshal 將按預期工作並將數據解組為指定值。這是因為指標允許 json 套件修改底層值。

場景3:不正確的指標使用

即使在使用指標類型時,請嘗試取得其傳遞給json.Unmarshal 時的位址(即使用&&i)可能會導致意外行為。在這種情況下,json.Unmarshal 會解引用指針,找出包含非指標的 interface{} 值,並建立一個新的 map[string]interface{} 值。

說明

interface{} 不只是一個無型容器,它本身就是一種類型。它包裝了一個值及其類型。傳遞一個指向interface{}的指標允許其他套件修改底層值,而傳遞一個interface{}值則直接阻止修改。

最佳實務

避免混淆,建議使用指向介面內值的指標而不是指向介面的指標。這種方法確保 json 套件可以正確地將資料解組為所需的類型。

以上是為什麼 Go 的 `interface{}` 類型會導致 `json.Unmarshal` 失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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