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!