首頁 > 後端開發 > Golang > 主體

Go JSON 解組:結構與介面 – 何時使用指標?

Patricia Arquette
發布: 2024-11-26 20:11:11
原創
127 人瀏覽過

Go JSON Unmarshalling: Structs vs. Interfaces – When to Use Pointers?

將JSON 解組為結構體與介面

在Go 中,encoding/json 套件提供了將JSON 資料與Go 值相互轉換的功能。將 JSON 解組為結構時,重要的是要了解套件需要有關目標類型的明確指令。

預設情況下,將 JSON 解組為介面時,套件會根據資料結構選擇適當的類型。對於 JSON 對象,它選擇 map[string]interface{},對於 JSON 數組,它選擇 []interface{}。但是,在處理結構時,這種行為有所不同。

要將 JSON 解組為特定結構,您需要將指向該結構的指標作為 json.Unmarshal() 的第二個參數傳遞。這是因為 Go 在將指標傳遞給函數時會自動取消引用指標。

但是,如果您嘗試將 JSON 解組到包含非指標結構體值的 interface{} 變數中,則套件無法確定預期的值目標類型。相反,它會將資料解釋為映射或切片,具體取決於其結構。

要解決此問題,您應該使用指標參考將結構體值包裝在 interface{} 中。這確保json.Unmarshal 具有解組為適當類型所需的資訊:

func getFoo() interface{} {
    return &Foo{"bar"} // Use a pointer wrapper
}
登入後複製

這是範例程式碼的改進版本:

package main

import (
    "encoding/json"
    "fmt"
)

type Foo struct {
    Bar string `json:"bar"`
}  

func getFoo() interface{} {
    return &Foo{"bar"}
}

func main() {

    fooInterface := getFoo() 

    myJSON := `{"bar":"This is the new value of bar"}`
    jsonBytes := []byte(myJSON)

    err := json.Unmarshal(jsonBytes, fooInterface )
    if err != nil {
        fmt.Println(err)
    }
    fmt.Printf("%T %+v", fooInterface, fooInterface) 
}
登入後複製

此更新的程式碼將成功列印具有更新的「bar」值的未編組的Foo 結構。

以上是Go JSON 解組:結構與介面 – 何時使用指標?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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