Maison >développement back-end >Golang >Pourquoi l'impression de structures imbriquées entraîne-t-elle un débordement de pile Goroutine dans Go ?

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

Barbara Streisand
Barbara Streisandoriginal
2024-11-04 19:37:02832parcourir

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>

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>

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>

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!

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