Heim > Artikel > Backend-Entwicklung > Warum funktioniert „json.Unmarshal“ mit einer Referenz, aber nicht mit einem Zeiger?
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!