Antaramuka Golang{} Salah Faham Jenis
Apabila menggunakan jenis antara muka{} sebagai parameter fungsi, pembangun sering menghadapi tingkah laku yang tidak dijangka, terutamanya apabila berinteraksi dengan data JSON melalui json.Unmarshal.
The Isu:
Dalam Go, antara muka{} ialah jenis yang boleh menyimpan sebarang nilai dan jenis. Walau bagaimanapun, ia lazimnya disalah ertikan sebagai bekas tanpa taip. Salah faham ini timbul dalam situasi seperti:
func test(i interface{}) { j := []byte(`{ "foo": "bar" }`) json.Unmarshal(j, &i) fmt.Println(i) } func main() { test(Test{}) }
Gelagat Yang Dijangka:
Kod ini cuba menyahmarshal data JSON ke dalam struct Ujian. Walau bagaimanapun, ia menghasilkan penukaran yang tidak dijangka bagi struct kepada jenis map[rentetan]antara muka{}.
Penjelasan:
json.Unmarshal tidak boleh menyahmarshal JSON ke dalam nilai bukan penunjuk. Memandangkan i ialah antara muka{} yang memegang struct Ujian, ia diluluskan sebagai alamat (&i) untuk membenarkan pengubahsuaian. Walau bagaimanapun, json.Unmarshal melihat penuding{} antara muka sebagai penuding kepada nilai{} antara muka yang mengandungi struktur Ujian. Tidak dapat menyahmarshal menjadi bukan penuding, ia lalai untuk mencipta nilai [rentetan]antara muka{} peta baharu untuk JSON yang tidak dikawal.
Pendekatan yang Betul:
Untuk menyelesaikan salah faham ini, pertimbangkan perkara berikut senario:
func test(i *interface{}) { j := []byte(`{ "foo": "bar" }`) json.Unmarshal(j, i) fmt.Println(*i) } func main() { var i *Test test(&i) }
Penjelasan:
Kesimpulan:
antara muka{} ialah jenis yang boleh menyimpan sebarang nilai, tetapi ia bukan sekadar pemegang tempat untuk sebarang jenis. Untuk mengelakkan tingkah laku yang tidak dijangka, kendalikan penunjuk dengan betul apabila menggunakan antara muka{} sebagai parameter fungsi, terutamanya dengan operasi JSON.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengelak Kelakuan Tidak Dijangka Apabila Menggunakan `antara muka{}` Go dengan `json.Unmarshal`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!