Maison > développement back-end > Golang > Comment empêcher le débordement de pile dans « UnmarshalJSON » de Go ?

Comment empêcher le débordement de pile dans « UnmarshalJSON » de Go ?

Barbara Streisand
Libérer: 2024-12-30 19:02:18
original
362 Les gens l'ont consulté

How to Prevent Stack Overflow in Go's `UnmarshalJSON`?

Prévenir le débordement de pile dans UnmarshalJSON en interceptant l'appel d'Unmarshal

Dans le contexte d'implémentations personnalisées d'UnmarshalJSON, il peut être nécessaire d'effectuer des étapes supplémentaires lors de l’initialisation de la structure de données. Cependant, invoquer json.Unmarshal() dans UnmarshalJSON peut entraîner un débordement de pile car le décodeur JSON recherche à plusieurs reprises une implémentation personnalisée, ce qui entraîne une récursion infinie.

Pour éviter ce problème, l'implémentation par défaut sous-jacente peut être invoquée. sans déclencher la boucle récursive. Voici comment procéder :

  1. Créer un type intermédiaire avec le mot-clé Type :

    • Définir un nouveau type à l'aide du mot-clé type, tel que tapez personne2 Personne.
  2. Conversion de type et Affectation :

    • Utiliser la conversion de type pour attribuer la valeur d'origine au nouveau type, par exemple (*person2)(p). Cela créera une valeur du nouveau type sans hériter des méthodes du type sous-jacent.
  3. Invoquer la fonction Unmarshal par défaut :

    • Appelez json.Unmarshal avec le nouveau type, qui invoquera la valeur par défaut mise en œuvre.
  4. Post-traitement (facultatif) :

    • Effectuer tout post-traitement nécessaire après le démarshalage par défaut, comme l'exige la logique personnalisée.

Par en utilisant cette technique, la boucle récursive est interrompue car le nouveau type n'a pas de méthode UnmarshalJSON définie. Cela évite un débordement de pile et permet une initialisation transparente avec un traitement supplémentaire.

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