Heim  >  Artikel  >  Backend-Entwicklung  >  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
Mary-Kate OlsenOriginal
2024-11-04 12:18:02793Durchsuche

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>

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>

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>

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!

Stellungnahme:
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