Heim >Backend-Entwicklung >Golang >Warum ändert „json.Unmarshal' unerwartet meine Struktur, wenn ich „interface{}' verwende?
Der Interface-{}-Typ, ein wichtiger Aspekt der Go-Programmierung, ermöglicht die dynamische Handhabung von Werte, aber seine Verwendung kann oft zu Missverständnissen führen.
Ein häufiges Missverständnis entsteht, wenn interface{} als Funktionsparameter verwendet wird und ein Problem mit json.Unmarshal auftritt. Der folgende Codeausschnitt demonstriert diesen Fehler:
func test(i interface{}) { j := []byte(`{ "foo": "bar" }`) fmt.Printf("%T\n", i) fmt.Printf("%T\n", &i) json.Unmarshal(j, &i) fmt.Printf("%T\n", i) } func main() { test(Test{}) } type Test struct { Foo string }
Bei der Ausführung wandelt dieser Code die Struktur Test{} nach dem Unmarshalling unerwartet in eine Map[string]interface{} um, wie in der Ausgabe zu sehen ist:
main.Test *interface {} map[string]interface {}
Das Missverständnis liegt in der Natur des Schnittstellentyps{}. Es handelt sich nicht um einen leeren Container, wie manche vielleicht annehmen, sondern um einen Wrapper für ein Wert-Typ-Paar. Wenn der Nicht-Zeiger-Test{} an test() übergeben wird, erwartet die json.Unmarshal-Funktion einen Zeiger, was dazu führt, dass stattdessen ein neuer Map[string]interface{}-Wert erstellt wird.
Um dieses Problem zu beheben , muss man einen Zeiger auf den Parameter interface{} übergeben.
func test(i interface{}) { j := []byte(`{ "foo": "bar" }`) fmt.Printf("%T\n", i) fmt.Printf("%T\n", &i) json.Unmarshal(j, i) fmt.Printf("%T\n", i) fmt.Println(i) } func main() { test(&Test{}) }
Diese Änderung stellt sicher, dass ein Zeiger auf einen Zeiger an die Funktion übergeben wird, was json.Unmarshal ermöglicht um die JSON-Daten korrekt zu entpacken.
Es ist wichtig, sich daran zu erinnern, dass interface{} eine sorgfältige Verwendung erfordert, um unerwartetes Verhalten zu vermeiden. Für eine effektive Go-Entwicklung ist es wichtig, die zugrunde liegende Implementierung und ihre Auswirkungen auf Funktionen wie json.Unmarshal zu verstehen.
Das obige ist der detaillierte Inhalt vonWarum ändert „json.Unmarshal' unerwartet meine Struktur, wenn ich „interface{}' verwende?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!