Maison > développement back-end > Golang > Pourquoi l'impression d'une structure imbriquée provoque-t-elle un débordement de pile ?

Pourquoi l'impression d'une structure imbriquée provoque-t-elle un débordement de pile ?

Barbara Streisand
Libérer: 2024-11-04 17:01:02
original
1103 Les gens l'ont consulté

Why Does Printing a Nested Struct Cause a Stack Overflow?

Utilisation excessive de la pile lors de l'impression de structures imbriquées

Méthode Nested Struct et String()

Considérez la structure imbriquée suivante :

<code class="go">type ConfigOne struct {
    Daemon daemon
}
type daemon struct {
    Loglevel int
    Logfile string
}</code>
Copier après la connexion

Une méthode de chaîne String() convertit les éléments de la structure en une chaîne :

<code class="go">func (c ConfigOne) String() string {
    return fmt.Sprintf("%+v\n", c)
}</code>
Copier après la connexion

Récursion et débordement de pile

Lors de l'impression de la structure imbriquée avec c.String(), ce qui suit une erreur se produit :

runtime: goroutine stack exceeds 1000000000-byte limit
fatal error: stack overflow
Copier après la connexion

Cette erreur indique une utilisation excessive de la pile en raison de la récursivité. La récursivité est provoquée par le format % v, qui appelle String() pour la structure démon imbriquée. Ce processus se répète indéfiniment, entraînant un débordement de pile.

Solution

Pour résoudre la récursion, évitez d'utiliser % v dans la méthode String(). Au lieu de cela, construisez la chaîne manuellement, comme démontré ci-dessous :

<code class="go">func (c ConfigOne) String() string {
    //return fmt.Sprintf("%+v\n", c.Daemon.Loglevel)
    return fmt.Sprintf("%+v\n", c.Daemon)
}</code>
Copier après la connexion

En formatant explicitement la structure du démon, nous évitons la récursivité infinie et garantissons que les données souhaitées sont générées.

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