Rumah >pembangunan bahagian belakang >Golang >Mengapa JSON Unmarshal Mengembalikan Peta Daripada Struct in Go Apabila Bekerja dengan Antara Muka?
Misteri Di Sebalik JSON Unmarshal Mengembalikan Peta Daripada Struktur Yang Dimaksudkan
Pembubaran JSON dalam Go boleh menimbulkan cabaran apabila berurusan dengan antara muka dan struktur. Pembangun mungkin menghadapi situasi di mana proses unmarshal menghasilkan peta dan bukannya struct yang dijangkakan, seperti yang berlaku dalam coretan yang diberikan:
<code class="go">import "encoding/json" import "fmt" import "reflect" func main() { type Ping struct { ID int `json:"id"` } var ping interface{} = Ping{} if err := json.Unmarshal([]byte(`{"id":42}`), &ping); err != nil { panic(err) } fmt.Println("Unexpected:", ping) // Result: map[id:42] }</code>
Sebab yang mendasari tingkah laku ini terletak pada sifat abstrak antara muka. Apabila pembongkaran JSON dilakukan pada antara muka, hasilnya ialah peta yang mewakili medan jenis asas. Dalam contoh di atas, antara muka Ping memegang peta dengan pasangan nilai kunci tunggal: {"id":42}.
Untuk membetulkan isu ini dan mendapatkan struct yang diingini, adalah penting untuk menghantar penunjuk kepada jenis struct tertentu:
<code class="go">type Ping struct { ID int `json:"id"` } func main() { var ping Ping if err := json.Unmarshal([]byte(`{"id":42}`), &ping); err != nil { panic(err) } fmt.Println("Success:", ping) // Result: {42} }</code>
Dengan menghantar penuding kepada Ping, proses unmarshal JSON diarahkan untuk mencipta instance struct dan mengisi medannya daripada mencipta peta.
Sebagai alternatif, jika penunjuk kepada struct konkrit tidak tersedia, anda boleh menggunakan refleksi untuk mencipta penunjuk secara dinamik dan seterusnya memberikan nilainya kepada antara muka:
<code class="go">import "reflect" func main() { var ping interface{} = Ping{} nptr := reflect.New(reflect.TypeOf(ping)) if err := json.Unmarshal([]byte(`{"id":42}`), nptr.Interface()); err != nil { panic(err) } ping = nptr.Elem().Interface() fmt.Println("Reflect-Based:", ping) // Result: {42} }</code>
Atas ialah kandungan terperinci Mengapa JSON Unmarshal Mengembalikan Peta Daripada Struct in Go Apabila Bekerja dengan Antara Muka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!