Heim > Backend-Entwicklung > Golang > Warum schlägt „json.Unmarshal' fehl, wenn Schnittstellen anstelle von Strukturen verwendet werden?

Warum schlägt „json.Unmarshal' fehl, wenn Schnittstellen anstelle von Strukturen verwendet werden?

Patricia Arquette
Freigeben: 2024-11-26 04:26:12
Original
420 Leute haben es durchsucht

Why Does `json.Unmarshal` Fail When Using Interfaces Instead of Structs?

Unmarshaling von JSON in Strukturen, nicht in Schnittstellen

Beim Unmarshaling von JSON-Daten mit json.Unmarshal ist es wichtig, einen konkreten Typ für die Zielvariable anzugeben, um unerwartete Konvertierungen zu vermeiden.

In Ihrem bereitgestellten Code definieren Sie eine Funktion getFoo(), die eine Schnittstelle zurückgibt, die eine Foo-Struktur enthält. Wenn Sie diese Schnittstelle an json.Unmarshal senden, interpretiert es den Wert als Karte und nicht als konkrete Struktur.

Um dieses Problem zu beheben, können Sie entweder einen Zeiger auf die konkrete Struktur innerhalb der Schnittstelle übergeben oder die angeben konkreter Strukturtyp direkt in json.Unmarshal.

Hier ist ein Beispiel mit a Zeiger:

func getFoo() interface{} {
    return &Foo{"bar"}
}

func main() {
    fooInterface := getFoo()

    jsonBytes := []byte(`{"bar":"This is the new value of bar"}`)

    err := json.Unmarshal(jsonBytes, fooInterface)
    if err != nil {
        fmt.Println(err)
    }

    fmt.Println(fooInterface) // *main.Foo &{Bar:This is the new value of bar}
}
Nach dem Login kopieren

Alternativ können Sie die Typzusicherung verwenden, um den konkreten Typ anzugeben:

func main() {
    fooInterface := getFoo()

    jsonBytes := []byte(`{"bar":"This is the new value of bar"}`)

    foo := fooInterface.(*Foo)
    err := json.Unmarshal(jsonBytes, foo)
    if err != nil {
        fmt.Println(err)
    }

    fmt.Println(foo) // &{Bar:This is the new value of bar}
}
Nach dem Login kopieren

Durch die Bereitstellung eines konkreten Typs, entweder durch einen Zeiger oder eine Typzusicherung, stellen Sie dies sicher json.Unmarshal entmarshmiert die Daten direkt in die gewünschte Struktur und behält dabei ihre Typinformationen und Feldwerte bei.

Das obige ist der detaillierte Inhalt vonWarum schlägt „json.Unmarshal' fehl, wenn Schnittstellen anstelle von Strukturen verwendet werden?. 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