Heim >Backend-Entwicklung >Golang >Warum führt das Drucken einer verschachtelten Struktur zu einem Stapelüberlauf?

Warum führt das Drucken einer verschachtelten Struktur zu einem Stapelüberlauf?

Barbara Streisand
Barbara StreisandOriginal
2024-11-04 17:01:021057Durchsuche

Why Does Printing a Nested Struct Cause a Stack Overflow?

Übermäßige Stapelnutzung beim Drucken verschachtelter Strukturen

Verschachtelte Struktur und String()-Methode

Betrachten Sie die folgende verschachtelte Struktur:

<code class="go">type ConfigOne struct {
    Daemon daemon
}
type daemon struct {
    Loglevel int
    Logfile string
}</code>

Eine String()-String-Methode wandelt die Strukturelemente in einen String um:

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

Rekursion und Stapelüberlauf

Beim Drucken der verschachtelten Struktur mit c.String() geschieht Folgendes Es tritt ein Fehler auf:

runtime: goroutine stack exceeds 1000000000-byte limit
fatal error: stack overflow

Dieser Fehler weist auf eine übermäßige Stapelnutzung aufgrund einer Rekursion hin. Die Rekursion wird durch das %v-Format verursacht, das String() für die verschachtelte Daemon-Struktur aufruft. Dieser Vorgang wiederholt sich auf unbestimmte Zeit und führt zu einem Stapelüberlauf.

Lösung

Um die Rekursion aufzulösen, vermeiden Sie die Verwendung von % v in der String()-Methode. Erstellen Sie die Zeichenfolge stattdessen manuell, wie unten gezeigt:

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

Durch die explizite Formatierung der Daemon-Struktur vermeiden wir die unendliche Rekursion und stellen sicher, dass die beabsichtigten Daten ausgegeben werden.

Das obige ist der detaillierte Inhalt vonWarum führt das Drucken einer verschachtelten Struktur zu einem Stapelüberlauf?. 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