Heim > Artikel > Backend-Entwicklung > Wie vermeide ich Stapelüberlauffehler mit „fmt.Sprintf(\"% v\")` in verschachtelten Go-Strukturen?
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!