Heim > Backend-Entwicklung > Golang > Warum ändert „json.Unmarshal' unerwartet meine Struktur, wenn ich „interface{}' verwende?

Warum ändert „json.Unmarshal' unerwartet meine Struktur, wenn ich „interface{}' verwende?

Barbara Streisand
Freigeben: 2024-12-12 19:53:11
Original
232 Leute haben es durchsucht

Why Does `json.Unmarshal` Unexpectedly Change My Struct When Using `interface{}`?

Missverständnisse über den Interface-{}-Typ von Go

Hintergrund

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 unerwarteter Fehler mit json.Unmarshal

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
}
Nach dem Login kopieren

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 {}
Nach dem Login kopieren

Das Missverständnis verstehen

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{})
}
Nach dem Login kopieren

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.

Fazit

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!

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