Maison > développement back-end > Golang > Comment éviter le débordement de pile lors de l'appel de « json.Unmarshal » dans « UnmarshalJSON » ?

Comment éviter le débordement de pile lors de l'appel de « json.Unmarshal » dans « UnmarshalJSON » ?

Susan Sarandon
Libérer: 2024-12-25 19:18:16
original
833 Les gens l'ont consulté

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

Appelez json.Unmarshal dans UnmarshalJSON sans provoquer de débordement de pile

Problème :
Implémentations personnalisées d'UnmarshalJSON qui appeler json.Unmarshal peut conduire à une pile débordements.

Solution :

Pour éviter le problème de débordement de pile lors de l'appel de json.Unmarshal dans UnmarshalJSON, utilisez la technique suivante :

  1. Créez un nouveau type à l'aide du mot-clé type, en en faisant un wrapper par rapport à l'original. type.
  2. Type-convertissez la valeur d'origine en une instance du type wrapper.
  3. Appelez json.Unmarshal sur l'objet de type wrapper pour effectuer le démarshalage.
  4. Après le démarshalage , effectuez tout post-traitement personnalisé sur l'original type.

Raisonnement :

L'utilisation du mot-clé type pour créer un nouveau type supprime efficacement toutes les méthodes du type d'origine. Lorsque le type de wrapper est utilisé pendant le processus de démarshalage, le décodeur JSON ne trouvera pas d'implémentation UnmarshalJSON personnalisée et utilisera celle par défaut. Cela évite le problème de débordement de pile.

Exemple :

Considérez un type de personne avec un champ Âge :

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
}
Copier après la connexion

Cette technique permet une personnalisation post-traitement après le démarshalage, tout en évitant le problème de débordement de pile associé à l'appel de json.Unmarshal dans DémarshalJSON.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal