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
214 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!

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