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
Susan Sarandonoriginal
2024-12-25 19:18:16836parcourir

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
}

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!

Déclaration:
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