Heim >Backend-Entwicklung >Golang >Warum schlägt das Unmarshaling in einen nicht initialisierten Zeiger in Go fehl?

Warum schlägt das Unmarshaling in einen nicht initialisierten Zeiger in Go fehl?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-21 00:50:12916Durchsuche

Why Does Unmarshaling into an Uninitialized Pointer Fail in Go?

Unmarshaling in Referenzen und Zeiger

Beim Deserialisieren von JSON-Daten in Go-Strukturen spielt die Funktion json.Unmarshal eine entscheidende Rolle. Allerdings kann es bei Benutzern zu Unstimmigkeiten kommen, wenn sie versuchen, in Referenzen und Zeiger zu entpacken.

Beachten Sie die folgenden Codeausschnitte:

// Unmarshaling into a reference variable
var animals Animal
err := json.Unmarshal(jsonBlob, &animals)

Dieser Code entpackt die JSON-Daten erfolgreich in die Referenzvariable „Tiere“.

Jedoch ergibt sich ein anderes Ergebnis, wenn versucht wird, eine Zeigervariable zu entmarshalieren:

// Unmarshaling into a pointer variable
var animals *Animal
err := json.Unmarshal(jsonBlob, animals)

In diesem Fall schlägt Unmarshal mit einem obskuren Fehler fehl: „json: Unmarshal(nil *main.Animal )". Dieser Fehler tritt auf, weil Animals ein nicht initialisierter Zeiger ist.

In der Dokumentation für Unmarshal heißt es: „Wenn der Zeiger Null ist, weist Unmarshal einen neuen Wert zu, auf den er zeigen soll.“ Dieses Verhalten scheint jedoch bei nicht initialisierten Zeigern nicht zuzutreffen, wie aus der Fehlermeldung hervorgeht.

Um dieses Problem zu beheben, wird empfohlen, die Zeigervariable Animals zu initialisieren, bevor versucht wird, sie zu entmarshalieren:

animals = &Animal{}
err := json.Unmarshal(jsonBlob, animals)

Mit dieser Änderung sollte der Unmarshaling-Prozess erfolgreich sein.

Beachten Sie, dass in der Dokumentation der Begriff „Unmarshaling“ durchgängig verwendet wird.

Das obige ist der detaillierte Inhalt vonWarum schlägt das Unmarshaling in einen nicht initialisierten Zeiger in Go fehl?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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