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

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

DDD
Lepaskan: 2024-11-22 08:50:19
asal
654 orang telah melayarinya

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

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

Ini gagal dengan mesej ralat yang tidak jelas:

json: Unmarshal(nil *main.Animal)
Salin selepas log masuk

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!

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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan