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