Heim > Backend-Entwicklung > Golang > Wie vermeide ich Stapelüberlauffehler mit „fmt.Sprintf(\'% v\')` in verschachtelten Go-Strukturen?

Wie vermeide ich Stapelüberlauffehler mit „fmt.Sprintf(\'% v\')` in verschachtelten Go-Strukturen?

Mary-Kate Olsen
Freigeben: 2024-11-04 12:18:02
Original
867 Leute haben es durchsucht

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

Goroutine Stack Overflow Error with Nested Structs and fmt.Sprintf()

Das Problem tritt auf, wenn fmt.Sprintf() mit dem „ „% v“-Formatbezeichner in der String()-Methode einer verschachtelten Struktur. Das Format „% v“ ruft die String()-Methode jedes verschachtelten Typs rekursiv auf, was zu einer unendlichen Rekursion und einem Stapelüberlauffehler führt.

Bedenken Sie die verschachtelten Strukturen:

<code class="go">type ConfigOne struct {
    Daemon daemon
}

type daemon struct {
    Loglevel int
    Logfile string
}</code>
Nach dem Login kopieren

Der String ()-Methode für ConfigOne ist wie folgt definiert:

<code class="go">func (c ConfigOne)String()  string{
    return fmt.Sprintf("%+v\n", c)
}</code>
Nach dem Login kopieren

Beim Drucken verschachtelter Strukturelemente mit fmt.Sprintf("% v", c) verwendet das Format "% v" den Wert von c.String( ), was eine endlose Rekursion verursacht.

Um diese Rekursion zu vermeiden, erstellen Sie manuell die Zeichenfolge, die die verschachtelte Struktur darstellt, wie gezeigt:

<code class="go">func (c ConfigOne)String()  string{
    return fmt.Sprintf("Loglevel: %d, Logfile: %s\n", c.Daemon.Loglevel, c.Daemon.Logfile)
}</code>
Nach dem Login kopieren

Dieser Ansatz eliminiert die rekursiven String()-Aufrufe und ermöglicht Ihnen um den Inhalt der Zeichenfolge zu steuern.

Das obige ist der detaillierte Inhalt vonWie vermeide ich Stapelüberlauffehler mit „fmt.Sprintf(\'% v\')` in verschachtelten Go-Strukturen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage