Rumah >pembangunan bahagian belakang >Golang >Mengapakah `json.Unmarshal` Berfungsi dengan Rujukan tetapi Bukan Penunjuk?

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

Barbara Streisand
Barbara Streisandasal
2024-11-12 04:57:01511semak imbas

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)

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)

Ini keputusan dalam ralat "hujah tidak sah":

json: Unmarshal(nil *main.Animal)

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.)

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!

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