Heim > Backend-Entwicklung > Golang > Warum schlägt „json.Unmarshal' mit Gos „interface{}'-Typ fehl?

Warum schlägt „json.Unmarshal' mit Gos „interface{}'-Typ fehl?

Patricia Arquette
Freigeben: 2024-12-04 14:24:12
Original
966 Leute haben es durchsucht

Why Does `json.Unmarshal` Fail with Go's `interface{}` Type?

Missverständnis des Typs „Golang-Schnittstelle{}“

In Go ermöglicht der Typ „Schnittstelle{}“, dass Variablen Werte jeden Typs enthalten können. Die Verwendung von interface{} als Funktionsparametertyp kann jedoch bei der Arbeit mit json.Unmarshal zu unerwarteten Ergebnissen führen.

Szenario 1: Nicht-Zeigertyp mit Unmarshal

Wenn ein Nicht-Zeiger-Typ an einen Funktionsparameter vom Typ interface{} übergeben wird, kann json.Unmarshal kein Unmarshaling in den Wert durchführen. Stattdessen wird ein neuer Map[string]Interface{}-Wert erstellt und im Interface{} gespeichert. Dies liegt daran, dass json.Unmarshal einen Zeiger zum Unmarshalieren benötigt.

Szenario 2: Zeigertyp mit Unmarshal

Wenn stattdessen ein Zeiger auf den Wert übergeben wird, json. Unmarshal wird wie erwartet funktionieren und die Daten in den angegebenen Wert entmarshalieren. Dies liegt daran, dass der Zeiger es dem JSON-Paket ermöglicht, den zugrunde liegenden Wert zu ändern.

Szenario 3: Falsche Zeigerverwendung

Auch wenn ein Zeigertyp verwendet wird, wird versucht, ihn zu übernehmen Adresse bei der Übergabe an json.Unmarshal (d. h. die Verwendung von &&i) kann zu unerwartetem Verhalten führen. In diesem Fall dereferenziert json.Unmarshal den Zeiger, findet einen Interface{}-Wert, der einen Nicht-Zeiger enthält, und erstellt einen neuen Map[string]Interface{}-Wert.

Erklärung

interface{} ist nicht einfach ein typloser Container, sondern vielmehr ein Typ für sich. Es umschließt einen Wert und seinen Typ. Durch die Übergabe eines Zeigers an interface{} können andere Pakete den zugrunde liegenden Wert ändern, während die direkte Übergabe eines interface{}-Werts eine Änderung verhindert.

Best Practice

Um Verwirrung zu vermeiden , wird empfohlen, Zeiger auf Werte innerhalb von Schnittstellen anstelle von Zeigern auf Schnittstellen zu verwenden. Dieser Ansatz stellt sicher, dass das JSON-Paket Daten korrekt in den gewünschten Typ entmarsprimieren kann.

Das obige ist der detaillierte Inhalt vonWarum schlägt „json.Unmarshal' mit Gos „interface{}'-Typ 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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage