Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Saya Boleh Mengelak Kelakuan Tidak Dijangka Apabila Menggunakan `antara muka{}` Go dengan `json.Unmarshal`?

Bagaimanakah Saya Boleh Mengelak Kelakuan Tidak Dijangka Apabila Menggunakan `antara muka{}` Go dengan `json.Unmarshal`?

Mary-Kate Olsen
Lepaskan: 2024-12-21 08:06:12
asal
989 orang telah melayarinya

How Can I Avoid Unexpected Behavior When Using Go's `interface{}` with `json.Unmarshal`?

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{})
}
Salin selepas log masuk

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)
}
Salin selepas log masuk

Penjelasan:

  • Lepaskan penuding ke parameter antara muka{}, dengan berkesan membalut penuding dalam antara muka{}.
  • Di dalam fungsi, nyahrujuk penunjuk antara muka{} dan hantar terus ke json.Unmarshal.
  • Memandangkan saya memegang penunjuk pada struct Test, json.Unmarshal dengan betul menyahmarshal data JSON ke dalam struct.

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!

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