Erreur de débordement de pile Goroutine avec les structures imbriquées et fmt.Sprintf()
Le problème survient lors de l'utilisation de fmt.Sprintf() avec le " Spécificateur de format % v" dans la méthode String() d'une structure imbriquée. Le format "% v" appelle la méthode String() de chaque type imbriqué de manière récursive, conduisant à une récursion infinie et à une erreur de débordement de pile.
Considérez les structures imbriquées :
<code class="go">type ConfigOne struct { Daemon daemon } type daemon struct { Loglevel int Logfile string }</code>
La chaîne () pour ConfigOne est définie comme :
<code class="go">func (c ConfigOne)String() string{ return fmt.Sprintf("%+v\n", c) }</code>
Lors de l'impression d'éléments de structure imbriqués avec fmt.Sprintf("% v", c), le format "% v" utilise la valeur de c.String( ), provoquant une récursion sans fin.
Pour éviter cette récursion, construisez manuellement la chaîne représentant la structure imbriquée, comme indiqué :
<code class="go">func (c ConfigOne)String() string{ return fmt.Sprintf("Loglevel: %d, Logfile: %s\n", c.Daemon.Loglevel, c.Daemon.Logfile) }</code>
Cette approche élimine les appels récursifs String() et vous permet pour contrôler le contenu de la chaîne.
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!