Heim >Backend-Entwicklung >Golang >Wie gehe ich mit der Typzusicherung um, nachdem ich JSON in einer „Schnittstelle{}' in Go entmarshalingt habe?

Wie gehe ich mit der Typzusicherung um, nachdem ich JSON in einer „Schnittstelle{}' in Go entmarshalingt habe?

DDD
DDDOriginal
2024-12-16 21:29:19615Durchsuche

How to Handle Type Assertion After Unmarshaling JSON into an `interface{}` in Go?

Unmarshaling in eine Schnittstelle{} und Typzusicherung durchführen

Beim Empfang von Nachrichten über ein RabbitMQ-System und der Durchführung der Typzusicherung ist es wichtig zu verstehen die Typen, die vom JSON-Paket entmarshaled werden.

Standard-Unmarshaling Typen

Standardmäßig gibt json.Unmarshal die folgenden Werte zurück Typen:

  • bool
  • float64
  • string
  • []interface{ }
  • map[string]interface{}
  • nil

Unmarshaling in eine Schnittstelle{}

Beim Unmarshaling in eine Schnittstelle{} ist der zurückgegebene Wert eine generische Map[string]schnittstelle{}. Um den tatsächlichen Typ innerhalb der Karte zu bestimmen, können Sie entweder:

  • Die Daten manuell aus der Karte entpacken.
  • Direkt in den gewünschten Strukturtyp entpacken.

Beispiel für die Verwendung einer Wrapper-Struktur

Um das manuelle Entpacken von Daten zu vermeiden, sollten Sie die Verwendung in Betracht ziehen eine Wrapper-Struktur wie die folgende:

type Unpacker struct {
    Data       interface{}
}

func (u *Unpacker) UnmarshalJSON(b []byte) error {
    smth1 := &Something1{}
    err := json.Unmarshal(b, smth1)
    if err == nil & smth1.Thing != "" {
        u.Data = smth1
        return nil
    }

    if _, ok := err.(*json.UnmarshalTypeError); err != nil & !ok {
        return err
    }

    smth2 := &Something2{}
    err = json.Unmarshal(b, smth2)
    if err != nil {
        return err
    }

    u.Data = smth2
    return nil
}

Mit dieser Wrapper-Struktur können Sie Daten je nach Art der empfangenen Daten entweder in Something1 oder Something2 entmarshalieren.

Das obige ist der detaillierte Inhalt vonWie gehe ich mit der Typzusicherung um, nachdem ich JSON in einer „Schnittstelle{}' in Go entmarshalingt habe?. 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