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)
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)
Dies schlägt mit der obskuren Fehlermeldung fehl:
json: Unmarshal(nil *main.Animal)
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!