首頁 > 後端開發 > Golang > 為什麼使用'interface{}”時'json.Unmarshal”會意外更改我的結構?

為什麼使用'interface{}”時'json.Unmarshal”會意外更改我的結構?

Barbara Streisand
發布: 2024-12-12 19:53:11
原創
232 人瀏覽過

Why Does `json.Unmarshal` Unexpectedly Change My Struct When Using `interface{}`?

關於Go 的interface{} 類型的誤解

背景

interface{} 類型是Go 程式設計的一個重要方面,它允許動態處理值,但它的使用常常會導致誤解。

一個意外的錯誤json.Unmarshal

使用 interface{} 作為函數參數並遇到 json.Unmarshal 問題時,會出現一個常見的誤解。以下程式碼片段示範了此錯誤:

func test(i interface{}) {
    j := []byte(`{ "foo": "bar" }`)
    fmt.Printf("%T\n", i)
    fmt.Printf("%T\n", &i)
    json.Unmarshal(j, &i)
    fmt.Printf("%T\n", i)
}

func main() {
    test(Test{})
}

type Test struct {
    Foo string
}
登入後複製

執行時,此程式碼在解組後意外地將struct Test{} 轉換為map[string]interface{},如輸出所示:

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

理解誤解

誤解在於interface{} 類型的本質。它不像某些人想像的那樣是一個空容器,而是值類型對的包裝器。當非指標 Test{} 傳遞給 test() 時,json.Unmarshal 函數需要一個指針,導致它建立一個新的 map[string]interface{} 值。

解決此問題,必須傳遞一個指向interface{}參數的指標。

func test(i interface{}) {
    j := []byte(`{ "foo": "bar" }`)
    fmt.Printf("%T\n", i)
    fmt.Printf("%T\n", &i)
    json.Unmarshal(j, i)
    fmt.Printf("%T\n", i)
    fmt.Println(i)
}

func main() {
    test(&Test{})
}
登入後複製

這項修改確保將指向指標的指標傳遞給函數,從而允許 json.Unmarshal正確解組 JSON 資料。

結論

記住,interface{} 需要謹慎使用以避免意外行為,這一點至關重要。了解其底層實作及其對 json.Unmarshal 等函數的影響對於有效的 Go 開發至關重要。

以上是為什麼使用'interface{}”時'json.Unmarshal”會意外更改我的結構?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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