## Mengapakah `json.Unmarshal` mengembalikan peta dan bukannya struct apabila menyahmarshaling ke dalam antara muka{}?

Susan Sarandon
Lepaskan: 2024-10-26 06:24:02
asal
264 orang telah melayarinya

## Why does `json.Unmarshal` return a map instead of a struct when unmarshaling into an interface{}?

Jenis Pulangan Anomali daripada Antara Muka Marshaling dengan JSON

Dalam senario di mana json.Unmarshal digunakan untuk menukar tatasusunan bait kepada antara muka{}, keputusan yang tidak dijangka mungkin timbul apabila peta dikembalikan dan bukannya jenis struct yang dijangkakan. Percanggahan ini boleh dikaitkan dengan sifat abstrak jenis antara muka{}, menyebabkan pakej json tidak dapat membezakan struktur struktur asas.

Untuk membetulkan anomali ini, disyorkan untuk menghantar penuding secara eksplisit kepada yang dikehendaki struct, menghantarnya sebagai antara muka abstrak. Pendekatan ini membenarkan pakej json mengenali dan menyahsiri struct dengan sewajarnya.

Sebagai contoh, coretan kod yang diubah suai berikut menggambarkan gelagat yang diingini:

<code class="go">func bad() {
    var ping interface{} = &Ping{} // Pass a pointer to Ping as an interface
    deserialize([]byte(`{"id":42}`), ping)
    fmt.Println("DONE:", ping) // Now outputs a Ping struct
}</code>
Salin selepas log masuk

Sebagai alternatif, jika akses kepada penuding adalah tidak boleh dilaksanakan, peruntukan dinamik boleh digunakan untuk mencipta penunjuk baharu yang boleh dinyahsiri. Nilai antara muka{} asal kemudiannya boleh dikemas kini dengan nilai baharu.

<code class="go">func bad() {
    var ping interface{} = Ping{}
    nptr := reflect.New(reflect.TypeOf(ping))
    deserialize([]byte(`{"id":42}`), nptr.Interface())
    ping = nptr.Interface()
    fmt.Println("DONE:", ping) // Outputs a Ping struct
}</code>
Salin selepas log masuk

Dengan menggunakan salah satu daripada teknik ini, fungsi json.Unmarshal boleh menyahsiri tatasusunan bait dengan tepat ke dalam jenis struct yang dikehendaki, menghapuskan nilai pulangan peta yang tidak dijangka.

Atas ialah kandungan terperinci ## Mengapakah `json.Unmarshal` mengembalikan peta dan bukannya struct apabila menyahmarshaling ke dalam antara muka{}?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!