Warum schlägt „json.Unmarshal' mit einem Null-Zeiger auf primitive Typen fehl?

DDD
Freigeben: 2024-11-22 08:50:19
Original
616 Leute haben es durchsucht

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

Unmarshaling JSON: Zeiger vs. Referenzen

Mit der json.Unmarshal-Funktion können wir JSON-Daten in eine Go-Struktur konvertieren. Während die Dokumentation darauf hinweist, dass ein neuer Wert zugewiesen werden kann, wenn der Zeiger Null ist, ist dies nicht der Fall.

Betrachten Sie das folgende Beispiel:

var animals Animal

err := json.Unmarshal(jsonBlob, &animals)
Nach dem Login kopieren

Dies funktioniert wie erwartet, da Animals dies ist ein Nicht-Null-Zeiger. Wenn wir jedoch Animals in einen nicht initialisierten Zeiger ändern:

var animals *Animal

err := json.Unmarshal(jsonBlob, animals)
Nach dem Login kopieren

Dies schlägt mit der obskuren Fehlermeldung fehl:

json: Unmarshal(nil *main.Animal)
Nach dem Login kopieren

Dieser Fehler ist auf einen InvalidUnmarshalError zurückzuführen, der bei einem ungültigen Zeiger ausgelöst wird Das Argument wird an Unmarshal übergeben. In der Dokumentation wird nicht ausdrücklich angegeben, dass der Zeiger ungleich Null sein muss, was zu Verwirrung führen könnte.

Das widersprüchliche Zitat in der Dokumentation, das darauf hindeutet, dass Unmarshal einen neuen Wert für Nullzeiger zuweisen kann, könnte darauf hinweisen auf das Verhalten der Funktion „reflect.New“, die intern von Unmarshal verwendet wird, um einen neuen Wert zu erstellen, wenn der Zeiger Null ist. Reflect.New funktioniert jedoch nur für bestimmte Typen, z. B. Strukturen und Slices. Es funktioniert nicht für Zeiger auf primitive Typen wie *int oder *string.

Zusammenfassend erfordert json.Unmarshal einen Zeiger ungleich Null als zweites Argument. Für Nullzeiger primitiver Typen kann kein neuer Wert zugewiesen werden. Daher ist es wichtig, sicherzustellen, dass der Zeiger ungleich Null ist, bevor Sie versuchen, JSON-Daten darin zu entmarshalieren.

Das obige ist der detaillierte Inhalt vonWarum schlägt „json.Unmarshal' mit einem Null-Zeiger auf primitive Typen fehl?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage