Maison > développement back-end > Golang > Comment éviter les erreurs de débordement de pile avec `fmt.Sprintf(\'% v\')` dans les structures Go imbriquées ?

Comment éviter les erreurs de débordement de pile avec `fmt.Sprintf(\'% v\')` dans les structures Go imbriquées ?

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

How to Avoid Stack Overflow Errors with `fmt.Sprintf(

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

La chaîne () pour ConfigOne est définie comme :

<code class="go">func (c ConfigOne)String()  string{
    return fmt.Sprintf("%+v\n", c)
}</code>
Copier après la connexion

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

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!

source:php.cn
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