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!