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!