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