Maison > développement back-end > Golang > Pourquoi l'utilisation de `% v` dans la méthode `String()` d'une structure imbriquée entraîne-t-elle un débordement de pile ?

Pourquoi l'utilisation de `% v` dans la méthode `String()` d'une structure imbriquée entraîne-t-elle un débordement de pile ?

Mary-Kate Olsen
Libérer: 2024-11-04 12:20:02
original
1046 Les gens l'ont consulté

Why Does Using `% v` in a Nested Struct's `String()` Method Lead to a Stack Overflow?

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>
Copier après la connexion

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
Copier après la connexion

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>
Copier après la connexion

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 de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal