Menyahmarshall JSON ke dalam Structs vs. Interface
Dalam Go, pakej pengekodan/json menyediakan kefungsian untuk menukar data JSON kepada dan dari nilai Go . Apabila menyahmarshall JSON ke dalam struct, adalah penting untuk memahami bahawa pakej memerlukan arahan eksplisit pada jenis sasaran.
Secara lalai, apabila menyahmarshall JSON ke dalam antara muka, pakej memilih jenis yang sesuai berdasarkan struktur data. Untuk objek JSON, ia memilih peta[rentetan]antara muka{} dan untuk tatasusunan JSON, ia memilih []antara muka{}. Walau bagaimanapun, tingkah laku ini berbeza apabila berurusan dengan struct.
Untuk menyahmarshal JSON ke dalam struct tertentu, anda perlu menghantar penunjuk kepada struct sebagai parameter kedua json.Unmarshal(). Ini kerana Go secara automatik menyahrujuk penunjuk apabila menghantarnya kepada fungsi.
Walau bagaimanapun, jika anda cuba menyahmarshal JSON ke dalam antara muka{} pembolehubah yang mengandungi nilai struct bukan penuding, pakej tidak mempunyai cara untuk menentukan yang dimaksudkan jenis sasaran. Sebaliknya, ia akan mentafsir data sebagai peta atau kepingan, bergantung pada strukturnya.
Untuk menyelesaikan isu ini, anda harus membalut nilai struct anda dalam antara muka{} menggunakan rujukan penuding. Ini memastikan bahawa json.Unmarshal mempunyai maklumat yang diperlukan untuk menyahmarshal ke dalam jenis yang sesuai:
func getFoo() interface{} { return &Foo{"bar"} // Use a pointer wrapper }
Berikut ialah versi kod contoh yang lebih baik:
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) }
Kod yang dikemas kini ini akan berjaya dicetak struct Foo yang tidak dikawal dengan nilai "bar" yang dikemas kini.
Atas ialah kandungan terperinci Pergi JSON Unmarshalling: Structs vs. Interfaces – Bila Perlu Menggunakan Penunjuk?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!