Erreur d'impression récursive dans la méthode Nested Struct String()
Cette question explore le problème du débordement de pile lors de la tentative d'impression d'une structure imbriquée à l'aide la méthode String() avec le spécificateur de format % v.
Problème :
Un utilisateur tente de renvoyer des éléments de structure imbriqués dans la méthode String() en utilisant le code suivant :
<code class="go">func (c ConfigOne) String() string { return fmt.Sprintf("%+v\n", c) }</code>
Lorsque l'utilisateur tente d'imprimer la structure à l'aide de Logger.Infoln(c.String()), il rencontre l'erreur :
runtime: goroutine stack exceeds 1000000000-byte limit fatal error: stack overflow
Explication :
Les formats %v et %v utilisent la valeur de String() si le type l'implémente. Par conséquent, utiliser % v sur un type dans la fonction String() pour ce type provoque une récursion infinie.
Dans ce cas, la méthode String() appelle fmt.Sprintf("% v", c), qui appelle la méthode String() de manière récursive sur la structure Daemon intégrée, et ainsi de suite. Cela conduit à une boucle infinie et à un débordement de pile.
Solution :
Pour surmonter ce problème, l'utilisateur ne doit pas utiliser % v dans la fonction String(). Au lieu de cela, ils devraient construire leur propre chaîne, montrant le contenu de la structure comme bon leur semble. 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>
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!