Rumah >pembangunan bahagian belakang >Golang >Mengapakah `json.Unmarshal` Berkelakuan Berbeza dengan Nilai Penunjuk dan Bukan Penunjuk yang Diserahkan kepada Parameter `antara muka{}` dalam Go?
Antara Muka Golang{} Salah Faham Jenis
Apabila menggunakan antara muka{} sebagai jenis parameter fungsi dalam Go, adalah penting untuk memahami caranya mempengaruhi penggunaan json.Unmarshal. Menghantar jenis bukan penuding kepada parameter antara muka{} boleh membawa kepada hasil yang tidak dijangka.
Senario 1: Menghantar Nilai Bukan Penunjuk kepada Antara Muka{}
Dalam contoh yang diberikan, struct Test dihantar terus ke fungsi ujian, yang menjangkakan parameter antara muka{}:
test(Test{})
The output menunjukkan bahawa struct telah ditukar menjadi peta[rentetan]antaramuka{} oleh json.Unmarshal:
main.Test *interface {} map[string]interface {}
Ini kerana antara muka{} membalut pasangan (nilai; jenis) dan nilai yang diluluskan bukan penunjuk, jadi pakej json mencipta nilai baharu untuk dibongkar. Memandangkan lalai untuk objek JSON ialah map[rentetan]antara muka{}, inilah yang dibuat.
Senario 2: Melepasi Penunjuk ke Antara Muka{}
Melalui penunjuk kepada struct Ujian kepada fungsi ujian, bagaimanapun, menghasilkan yang diharapkan hasil:
test(&Test{})
*main.Test *interface {} *main.Test &{bar}
Ini kerana penuding kepada struct diserahkan kepada json.Unmarshal, membenarkannya unmarshal terus ke dalam nilai Ujian yang ditunjuk.
Penjelasan : Penunjuk dan Antara Muka
Apabila pakej perlu mengubah suai nilai yang disimpan dalam antara muka{}, ia perlu menerima penunjuk kepadanya. Dalam kes json.Unmarshal, ia menjangkakan penunjuk untuk unmarshal masuk. Apabila anda mempunyai nilai antara muka{} yang sudah membalut penuding, cuma hantarkannya tanpa mengambil alamatnya lagi.
Amalan Terbaik
Elakkan menggunakan penunjuk ke antara muka. Sebaliknya, letakkan penunjuk ke dalam antara muka dengan membungkusnya dalam nilai antara muka. Apabila anda perlu menghantar antara muka{} yang memegang penuding, hanya hantarkannya terus.
Atas ialah kandungan terperinci Mengapakah `json.Unmarshal` Berkelakuan Berbeza dengan Nilai Penunjuk dan Bukan Penunjuk yang Diserahkan kepada Parameter `antara muka{}` dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!