Rumah > pembangunan bahagian belakang > Golang > Mengapakah `json.Unmarshal` Berkelakuan Berbeza dengan Nilai Penunjuk dan Bukan Penunjuk yang Diserahkan kepada Parameter `antara muka{}` dalam Go?

Mengapakah `json.Unmarshal` Berkelakuan Berbeza dengan Nilai Penunjuk dan Bukan Penunjuk yang Diserahkan kepada Parameter `antara muka{}` dalam Go?

Susan Sarandon
Lepaskan: 2024-12-15 20:38:15
asal
784 orang telah melayarinya

Why Does `json.Unmarshal` Behave Differently with Pointer and Non-Pointer Values Passed to an `interface{}` Parameter in 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{})
Salin selepas log masuk

The output menunjukkan bahawa struct telah ditukar menjadi peta[rentetan]antaramuka{} oleh json.Unmarshal:

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

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{})
Salin selepas log masuk
*main.Test
*interface {}
*main.Test
&{bar}
Salin selepas log masuk

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!

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