Heim > Backend-Entwicklung > Golang > Wie vermeide ich einen Stapelüberlauf beim Aufruf von „json.Unmarshal' innerhalb von „UnmarshalJSON'?

Wie vermeide ich einen Stapelüberlauf beim Aufruf von „json.Unmarshal' innerhalb von „UnmarshalJSON'?

Susan Sarandon
Freigeben: 2024-12-25 19:18:16
Original
836 Leute haben es durchsucht

How to Avoid Stack Overflow When Calling `json.Unmarshal` Within `UnmarshalJSON`?

Json.Unmarshal innerhalb von UnmarshalJSON aufrufen, ohne einen Stapelüberlauf zu verursachen

Problem:
Benutzerdefinierte Implementierungen von UnmarshalJSON Der Aufruf von json.Unmarshal kann zum Stack führen Überläufe.

Lösung:

Um das Stapelüberlaufproblem beim Aufruf von json.Unmarshal in UnmarshalJSON zu vermeiden, verwenden Sie die folgende Technik:

  1. Erstellen Sie mit dem Schlüsselwort „type“ einen neuen Typ, der das Original umhüllt Typ.
  2. Konvertieren Sie den ursprünglichen Wert typmäßig in eine Instanz des Wrapper-Typs.
  3. Rufen Sie json.Unmarshal für das Wrapper-Typ-Objekt auf, um das Unmarshaling durchzuführen.
  4. Nach dem Unmarshaling , führen Sie eine beliebige benutzerdefinierte Nachbearbeitung am Original durch Typ.

Begründung:

Durch die Verwendung des Schlüsselworts „type“ zum Erstellen eines neuen Typs werden effektiv alle Methoden aus dem ursprünglichen Typ entfernt. Wenn der Wrapper-Typ während des Unmarshaling-Prozesses verwendet wird, findet der JSON-Decoder keine benutzerdefinierte UnmarshalJSON-Implementierung und verwendet die Standardimplementierung. Dies verhindert das Problem des Stapelüberlaufs.

Beispiel:

Betrachten Sie einen Personentyp mit einem Altersfeld:

type Person struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func (p *Person) UnmarshalJSON(data []byte) error {
    type personWrapper Person
    if err := json.Unmarshal(data, (*personWrapper)(p)); err != nil {
        return err
    }

    // Post-processing after unmarshaling:
    if p.Age < 0 {
        p.Age = 0
    }
    return nil
}
Nach dem Login kopieren

Diese Technik ermöglicht benutzerdefinierte Nachbearbeitung nach dem Unmarshaling, wobei das Problem des Stapelüberlaufs vermieden wird, das mit dem Aufruf von json.Unmarshal innerhalb verbunden ist UnmarshalJSON.

Das obige ist der detaillierte Inhalt vonWie vermeide ich einen Stapelüberlauf beim Aufruf von „json.Unmarshal' innerhalb von „UnmarshalJSON'?. 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