Heim >Backend-Entwicklung >Golang >Warum funktioniert „json.Unmarshal' mit einer Referenz, aber nicht mit einem Zeiger?

Warum funktioniert „json.Unmarshal' mit einer Referenz, aber nicht mit einem Zeiger?

Barbara Streisand
Barbara StreisandOriginal
2024-11-12 04:57:01513Durchsuche

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

Warum funktioniert Unmarshal mit Referenz, aber nicht mit Zeiger?

Um den Kontext für diese Anfrage bereitzustellen, deserialisiert die Funktion json.Unmarshal in Go JSON-Daten in eine Struktur, auf die durch die bereitgestellte Referenz verwiesen wird. Lassen Sie uns das Verhalten von Unmarshal in zwei Szenarien untersuchen.

Szenario 1: Verweis auf eine Struktur

Im ersten Szenario handelt es sich um einen Nicht-Null-Verweis auf eine Struktur an Unmarshal übergeben, wie im folgenden Snippet:

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

Dies funktioniert nahtlos. Laut Dokumentation weist Unmarshal einen neuen Strukturwert zu, auf den gezeigt werden soll, wenn der Zeiger Null ist (auf Null initialisiert). In diesem Fall ist Animals jedoch bereits initialisiert und zeigt auf eine gültige Struktur, sodass der Vorgang erfolgreich ist.

Szenario 2: Zeiger auf eine Struktur

In diesem Szenario , ein nicht initialisierter Zeiger auf eine Struktur wird an Unmarshal übergeben.

var animals *Animal
err := json.Unmarshal(jsonBlob, animals)

Dies führt zu einem „ungültigen“. Fehler „Argument“:

json: Unmarshal(nil *main.Animal)

Dies tritt auf, weil die Dokumentation nicht ganz klar ist. Es wird zwar erwähnt, dass Unmarshal eine neue Struktur zuweist, wenn der Zeiger Null ist, es wird jedoch nicht explizit angegeben, dass der Zeiger selbst ungleich Null sein muss, wie im folgenden Kommentar im Quellcode von Unmarshal angegeben:

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

Daher löst die Übergabe eines nicht initialisierten Zeigers (der in Go standardmäßig Null ist) an Unmarshal diesen Fehler aus, da er gegen die Anforderung für a verstößt Nicht-Null-Zeiger. Um dieses Problem zu beheben, initialisieren Sie einfach den Zeiger auf eine neue Struktur, bevor Sie Unmarshal aufrufen.

Schreibweise von „Unmarshalling“

Was die Schreibweise betrifft, sind sowohl „unmarshalling“ als auch „unmarshaling“ sind akzeptierte Schreibweisen, wobei die zweite laut einem grep der Go-Quelle im Go-Code häufiger vorkommt Codebasis.

Das obige ist der detaillierte Inhalt vonWarum funktioniert „json.Unmarshal' mit einer Referenz, aber nicht mit einem Zeiger?. 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