Rumah  >  Artikel  >  pembangunan bahagian belakang  >  ## Mengapakah `json.Unmarshal` mengembalikan peta dan bukannya struct apabila menyahmarshaling ke dalam antara muka{}?

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

Susan Sarandon
Susan Sarandonasal
2024-10-26 06:24:02246semak imbas

## 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>

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>

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!

Kenyataan:
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