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