Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah `json.Unmarshal` Gagal dengan Penunjuk Nil kepada Jenis Primitif?

Mengapakah `json.Unmarshal` Gagal dengan Penunjuk Nil kepada Jenis Primitif?

DDD
DDDasal
2024-11-22 08:50:19611semak imbas

Why Does `json.Unmarshal` Fail with a Nil Pointer to Primitive Types?

Menyahmarshaling JSON: Penunjuk lwn. Rujukan

Fungsi json.Unmarshal membenarkan kami menukar data JSON kepada struct Go. Walaupun dokumentasi mencadangkan bahawa ia boleh memperuntukkan nilai baharu jika penunjuk adalah sifar, ini tidak berlaku.

Pertimbangkan contoh berikut:

var animals Animal

err := json.Unmarshal(jsonBlob, &animals)

Ini berfungsi seperti yang diharapkan kerana haiwan adalah penunjuk bukan nol. Walau bagaimanapun, jika kita menukar haiwan kepada penunjuk yang tidak dimulakan:

var animals *Animal

err := json.Unmarshal(jsonBlob, animals)

Ini gagal dengan mesej ralat yang tidak jelas:

json: Unmarshal(nil *main.Animal)

Ralat ini berpunca daripada InvalidUnmarshalError, yang dilemparkan apabila tidak sah hujah diserahkan kepada Unmarshal. Dokumentasi tidak menyatakan secara eksplisit bahawa penuding mestilah bukan sifar, yang boleh menyebabkan kekeliruan.

Petikan bercanggah dalam dokumentasi, yang menunjukkan bahawa Unmarshal boleh memperuntukkan nilai baharu untuk penunjuk sifar, mungkin merujuk kepada tingkah laku reflect.Fungsi baharu, yang digunakan secara dalaman oleh Unmarshal untuk mencipta nilai baharu apabila penunjuk adalah nol. Walau bagaimanapun, reflect.New hanya berfungsi untuk jenis tertentu, seperti struct dan hirisan. Ia tidak berfungsi untuk penunjuk kepada jenis primitif, seperti *int atau *rentetan.

Ringkasnya, json.Unmarshal memerlukan penunjuk bukan nol sebagai hujah keduanya. Ia tidak boleh memperuntukkan nilai baharu untuk penunjuk nil jenis primitif. Oleh itu, adalah penting untuk memastikan bahawa penuding adalah bukan nol sebelum cuba untuk menyahmarshal data JSON ke dalamnya.

Atas ialah kandungan terperinci Mengapakah `json.Unmarshal` Gagal dengan Penunjuk Nil kepada Jenis Primitif?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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