Rumah > pembangunan bahagian belakang > Golang > Mengapakah `json.Unmarshal` Mengubah Struktur Saya Secara Tidak Dijangka Apabila Menggunakan `antara muka{}`?

Mengapakah `json.Unmarshal` Mengubah Struktur Saya Secara Tidak Dijangka Apabila Menggunakan `antara muka{}`?

Barbara Streisand
Lepaskan: 2024-12-12 19:53:11
asal
312 orang telah melayarinya

Why Does `json.Unmarshal` Unexpectedly Change My Struct When Using `interface{}`?

Salah Tanggapan Mengenai antara muka Go{} Jenis

Latar Belakang

Jenis antara muka{}, satu aspek penting pengaturcaraan Go, membolehkan pengendalian dinamik bagi nilai, tetapi penggunaannya selalunya boleh menyebabkan salah faham.

Pepijat Tidak Dijangka dengan json.Unmarshal

Salah tanggapan biasa timbul apabila menggunakan antara muka{} sebagai parameter fungsi dan menghadapi isu dengan json.Unmarshal. Coretan kod berikut menunjukkan pepijat ini:

func test(i interface{}) {
    j := []byte(`{ "foo": "bar" }`)
    fmt.Printf("%T\n", i)
    fmt.Printf("%T\n", &i)
    json.Unmarshal(j, &i)
    fmt.Printf("%T\n", i)
}

func main() {
    test(Test{})
}

type Test struct {
    Foo string
}
Salin selepas log masuk

Apabila dijalankan, kod ini secara tidak dijangka mengubah Ujian struct{} ke dalam peta[rentetan]antara muka{} selepas dibongkar, seperti yang dilihat dalam output:

main.Test
*interface {}
map[string]interface {}
Salin selepas log masuk

Memahami Salah Tanggapan

Salah faham terletak pada sifat jenis antara muka{}. Ia bukan bekas kosong seperti yang mungkin diandaikan oleh sesetengah orang, sebaliknya pembungkus untuk pasangan jenis nilai. Apabila Ujian bukan penuding{} dihantar ke test(), fungsi json.Unmarshal menjangkakan penuding, menyebabkan ia mencipta nilai [rentetan]antara muka{} peta baharu.

Untuk menyelesaikan isu ini , seseorang mesti menghantar penuding kepada parameter antara muka{}.

func test(i interface{}) {
    j := []byte(`{ "foo": "bar" }`)
    fmt.Printf("%T\n", i)
    fmt.Printf("%T\n", &i)
    json.Unmarshal(j, i)
    fmt.Printf("%T\n", i)
    fmt.Println(i)
}

func main() {
    test(&Test{})
}
Salin selepas log masuk

Pengubahsuaian ini memastikan bahawa penuding kepada penuding dihantar ke fungsi, membenarkan json.Unmarshal untuk menyahmarshal data JSON dengan betul.

Kesimpulan

Adalah penting untuk mengingati bahawa antara muka{} memerlukan penggunaan berhati-hati untuk mengelakkan tingkah laku yang tidak dijangka. Memahami pelaksanaan asasnya dan implikasinya pada fungsi seperti json.Unmarshal adalah penting untuk pembangunan Go yang berkesan.

Atas ialah kandungan terperinci Mengapakah `json.Unmarshal` Mengubah Struktur Saya Secara Tidak Dijangka Apabila Menggunakan `antara muka{}`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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