Mengapakah `json.Unmarshal` Berfungsi dengan Rujukan tetapi Bukan Penunjuk?

Barbara Streisand
Lepaskan: 2024-11-12 04:57:01
asal
478 orang telah melayarinya

Why Does `json.Unmarshal` Work with a Reference but Not a Pointer?

Mengapa Unmarshal Berfungsi dengan Rujukan tetapi Bukan Penunjuk?

Untuk menyediakan konteks bagi pertanyaan ini, dalam Go, fungsi json.Unmarshal nyahserialisasi Data JSON ke dalam struct yang ditunjukkan oleh rujukan yang disediakan. Mari kita mendalami tingkah laku Unmarshal dalam dua senario.

Senario 1: Rujukan kepada Struktur

Dalam senario pertama, rujukan bukan nol kepada struct ialah diserahkan kepada Unmarshal, seperti yang berikut coretan:

var animals Animal
err := json.Unmarshal(jsonBlob, &animals)
Salin selepas log masuk

Ini berfungsi dengan lancar. Seperti dalam dokumentasi, jika penunjuk adalah sifar (dimulakan kepada sifar), Unmarshal memperuntukkan nilai struct baharu untuk ditunjuk. Walau bagaimanapun, dalam kes ini, haiwan telah dimulakan dan menunjuk kepada struct yang sah, jadi operasi berjaya.

Senario 2: Penunjuk kepada Struktur

Dalam senario ini , penunjuk yang tidak dimulakan kepada struct diserahkan kepada Unmarshal.

var animals *Animal
err := json.Unmarshal(jsonBlob, animals)
Salin selepas log masuk

Ini keputusan dalam ralat "hujah tidak sah":

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

Ini berlaku kerana dokumentasi tidak jelas sepenuhnya. Walaupun ia menyebut bahawa Unmarshal memperuntukkan struktur baharu jika penunjuk adalah sifar, ia tidak menyatakan secara eksplisit bahawa penunjuk itu sendiri mestilah bukan sifar, seperti yang ditunjukkan dalam ulasan berikut dalam kod sumber Unmarshal:

// An InvalidUnmarshalError describes an invalid argument passed to Unmarshal.
// (The argument to Unmarshal must be a non-nil pointer.)
Salin selepas log masuk

Oleh itu, menghantar penuding yang tidak dimulakan (yang sifar secara lalai dalam Go) kepada Unmarshal mencetuskan ralat ini, kerana ia melanggar keperluan untuk penunjuk bukan nol. Untuk menyelesaikan isu ini, hanya mulakan penuding kepada struct baharu sebelum memanggil Unmarshal.

Ejaan "Unmarshaling"

Bagi ejaan, kedua-dua "unmarshalling" dan "unmarshaling" ialah ejaan yang diterima, dengan ejaan kedua lebih biasa dalam kod Go mengikut grep sumber Go pangkalan kod.

Atas ialah kandungan terperinci Mengapakah `json.Unmarshal` Berfungsi dengan Rujukan tetapi Bukan Penunjuk?. 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