Maison > développement back-end > Golang > le corps du texte

Pourquoi l'impression de structures imbriquées entraîne-t-elle un débordement de pile Goroutine dans Go ?

Barbara Streisand
Libérer: 2024-11-04 19:37:02
original
787 Les gens l'ont consulté

Why Does Nested Struct Printing Lead to Goroutine Stack Overflow in Go?

Erreur d'exécution : débordement de pile Goroutine en raison d'une structure imbriquée

Lorsque vous travaillez avec des structures imbriquées dans Go, il est important d'être conscient de la pile potentielle déborde. Cela peut se produire lorsque vous tentez d'imprimer une structure imbriquée à l'aide d'un format qui repose sur la méthode String() de la structure.

Cause fondamentale :

Une récursivité infinie se produit lorsque la méthode String() d'une structure tente d'imprimer la même structure que l'un de ses champs. Les formats %v et %v utilisent la valeur de String() si elle existe. Cela crée une boucle infinie, conduisant à un débordement de pile.

Exemple :

Considérez la structure imbriquée suivante et la méthode String() :

<code class="go">type ConfigOne struct {
    // Daemon section from config file.
    Daemon daemon
}

type daemon struct {
    Loglevel int
    Logfile string
}

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

Lorsque vous tentez d'imprimer une instance de ConfigOne à l'aide de cette méthode String(), une erreur de débordement de pile se produira se produire :

<code class="go">c := &modules.ConfigOne{}
c.Daemon.Loglevel = 1
c.Daemon.Logfile = "/tmp/test.log"
modules.Logger.Infoln(c.String())</code>
Copier après la connexion

Solution :

Pour éviter une récursion infinie et des débordements de pile, la méthode String() doit construire une chaîne manuellement, en spécifiant le format souhaité pour le structures imbriquées. Par exemple :

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

Dans ce cas, la méthode String() formate explicitement les champs imbriqués sans utiliser %v ou %v, résolvant ainsi le problème de récursivité infinie.

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