Maison > développement back-end > Golang > Comment éviter le débordement de pile lors du marshaling et du démarshaling JSON dans Go ?

Comment éviter le débordement de pile lors du marshaling et du démarshaling JSON dans Go ?

Patricia Arquette
Libérer: 2024-12-26 18:52:14
original
638 Les gens l'ont consulté

How to Avoid Stack Overflow When Marshaling and Unmarshaling JSON in Go?

Marshaling et Unmarshalling JSON sans débordement de pile

Dans l'encodage JSON, l'appel de json.Unmarshal dans la méthode UnmarshalJSON peut entraîner un débordement de pile. Ce problème survient car le décodeur recherche en permanence une implémentation UnmarshalJSON personnalisée, qui dans ce cas est appelée à plusieurs reprises.

Pour éviter cela, une solution courante consiste à créer un nouveau type à l'aide du mot-clé type. Ce nouveau type sert effectivement de wrapper pour le type d’origine. En convertissant la valeur d'origine vers le nouveau type et en la transmettant à json.Unmarshal, le débordement de pile peut être évité.

Cette approche est efficace car la conversion de type ne modifie pas la représentation des données. Conformément à la spécification Go, les conversions de type non numérique modifient uniquement le type sans altérer la représentation sous-jacente.

Dans l'exemple suivant, un type Personne est défini avec un champ Âge numérique. Une méthode UnmarshalJSON personnalisée garantit que l'âge n'est jamais négatif :

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

func (p *Person) UnmarshalJSON(data []byte) error {
    type person2 Person
    if err := json.Unmarshal(data, (*person2)(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 peut également être appliquée aux méthodes de marshalling personnalisées (MarshalJSON) pour effectuer un prétraitement avant la sérialisation des données.

Rappelez-vous , lors de la définition d'une méthode String() pour une représentation de texte personnalisée, il est essentiel de faire la distinction entre l'utilisation de t et *t pour éviter de modifier par inadvertance la chaîne par défaut. représentation.

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