Jenis antara muka{}, satu aspek penting pengaturcaraan Go, membolehkan pengendalian dinamik bagi nilai, tetapi penggunaannya selalunya boleh menyebabkan salah faham.
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 }
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 {}
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{}) }
Pengubahsuaian ini memastikan bahawa penuding kepada penuding dihantar ke fungsi, membenarkan json.Unmarshal untuk menyahmarshal data JSON dengan betul.
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!