Maison >développement back-end >Golang >Pourquoi l'utilisation de `% v` dans une méthode `String()` conduit-elle à une récursion infinie avec des structures imbriquées ?
Débordement de pile récursif infini avec des structures imbriquées dans la fonction String()
Considérez les structures imbriquées suivantes :
type ConfigOne struct { Daemon daemon } type daemon struct { Loglevel int Logfile string }
Maintenant, supposons que nous définissions une méthode de chaîne String() sur ConfigOne type:
func (c ConfigOne)String() string { return fmt.Sprintf("%+v\n", c) }
Cette méthode String() tente de renvoyer les valeurs des éléments de structure imbriqués en utilisant le spécificateur de format % v. Cependant, cela conduit à une erreur de débordement de pile récursive infinie.
La raison de cette erreur est que les spécificateurs de format %v et %v utilisent la valeur de la fonction String() si le type l'implémente. Par conséquent, utiliser % v sur un type dans la fonction String() pour ce type crée un appel récursif qui ne se termine jamais.
Pour éviter cette erreur, vous ne devez pas utiliser % v dans votre fonction String(). Au lieu de cela, vous devez construire manuellement votre chaîne en accédant et en formatant explicitement les valeurs des champs :
func (c ConfigOne)String() string { return fmt.Sprintf("Loglevel: %d, Logfile: %s\n", c.Daemon.Loglevel, c.Daemon.Logfile) }
Cette fonction String() modifiée ne provoque plus de récursion infinie et affiche correctement les valeurs des éléments de structure imbriqués. .
Vous pouvez également remplacer la méthode String() dans la structure du démon imbriqué pour empêcher le récursion :
func (d daemon)String() string { return fmt.Sprintf("Loglevel: %d, Logfile: %s\n", d.Loglevel, d.Logfile) }
En remplaçant la méthode String() dans la structure imbriquée, vous rompez la chaîne d'appels récursifs et vous assurez que la fonction String() ne génère que les valeurs de la structure imbriquée elle-même, plutôt que toutes ses structures contenant.
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!