Heim >Backend-Entwicklung >Golang >Gehen Sie zum JSON-Unmarshalling: Strukturen vs. Schnittstellen – Wann sollten Zeiger verwendet werden?

Gehen Sie zum JSON-Unmarshalling: Strukturen vs. Schnittstellen – Wann sollten Zeiger verwendet werden?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-26 20:11:11151Durchsuche

Go JSON Unmarshalling: Structs vs. Interfaces – When to Use Pointers?

Unmarshalling von JSON in Structs vs. Interfaces

In Go bietet das Paket „encoding/json“ Funktionen zum Konvertieren von JSON-Daten in und aus Go-Werten . Beim Unmarshalling von JSON in eine Struktur ist es wichtig zu verstehen, dass das Paket explizite Anweisungen zum Zieltyp erfordert.

Standardmäßig wählt das Paket beim Unmarshalling von JSON in eine Schnittstelle einen geeigneten Typ basierend auf der Datenstruktur aus. Für JSON-Objekte wird „map[string]interface{}“ und für JSON-Arrays „[]interface{}“ ausgewählt. Dieses Verhalten unterscheidet sich jedoch beim Umgang mit Strukturen.

Um JSON in eine bestimmte Struktur zu entmarshalieren, müssen Sie einen Zeiger auf die Struktur als zweiten Parameter von json.Unmarshal() übergeben. Dies liegt daran, dass Go Zeiger automatisch dereferenziert, wenn sie an Funktionen übergeben werden.

Wenn Sie jedoch versuchen, JSON in eine Interface{}-Variable zu entmarshalieren, die einen Nicht-Zeiger-Strukturwert enthält, hat das Paket keine Möglichkeit, den beabsichtigten Wert zu ermitteln Zieltyp. Stattdessen werden die Daten je nach Struktur als Karte oder Slice interpretiert.

Um dieses Problem zu beheben, sollten Sie Ihren Strukturwert mithilfe einer Zeigerreferenz in eine Schnittstelle{} einschließen. Dadurch wird sichergestellt, dass json.Unmarshal über die notwendigen Informationen zum Unmarshalieren in den entsprechenden Typ verfügt:

func getFoo() interface{} {
    return &Foo{"bar"} // Use a pointer wrapper
}

Hier ist eine verbesserte Version des Beispielcodes:

package main

import (
    "encoding/json"
    "fmt"
)

type Foo struct {
    Bar string `json:"bar"`
}  

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

func main() {

    fooInterface := getFoo() 

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

    err := json.Unmarshal(jsonBytes, fooInterface )
    if err != nil {
        fmt.Println(err)
    }
    fmt.Printf("%T %+v", fooInterface, fooInterface) 
}

Dieser aktualisierte Code wird erfolgreich gedruckt die nicht gemarshallte Foo-Struktur mit dem aktualisierten „bar“-Wert.

Das obige ist der detaillierte Inhalt vonGehen Sie zum JSON-Unmarshalling: Strukturen vs. Schnittstellen – Wann sollten Zeiger verwendet werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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