Warum führt die Verwendung von „% v' in einer „String()'-Methode zu einer unendlichen Rekursion mit verschachtelten Strukturen?

Susan Sarandon
Freigeben: 2024-11-05 14:56:02
Original
131 Leute haben es durchsucht

Why Does Using `% v` in a `String()` Method Lead to Infinite Recursion with Nested Structs?

Unendlicher rekursiver Stapelüberlauf mit verschachtelten Strukturen in der String()-Funktion

Berücksichtigen Sie die folgenden verschachtelten Strukturen:

type ConfigOne struct {
    Daemon daemon
}

type daemon struct {
    Loglevel int
    Logfile string
}
Nach dem Login kopieren

Nehmen wir nun an, wir definieren eine String()-String-Methode für den Typ ConfigOne:

func (c ConfigOne)String() string {
    return fmt.Sprintf("%+v\n", c)
}
Nach dem Login kopieren

Diese String()-Methode versucht, die Werte der verschachtelten Strukturelemente mithilfe des Formatbezeichners %v zurückzugeben. Dies führt jedoch zu einem unendlichen rekursiven Stapelüberlauffehler.

Der Grund für diesen Fehler ist, dass die Formatspezifizierer %v und %v den Wert der String()-Funktion verwenden, wenn der Typ ihn implementiert. Daher erzeugt die Verwendung von % v für einen Typ innerhalb der String()-Funktion für diesen Typ einen rekursiven Aufruf, der nie endet.

Um diesen Fehler zu vermeiden, sollten Sie % v nicht in Ihrer String()-Funktion verwenden. Stattdessen sollten Sie Ihre Zeichenfolge manuell erstellen, indem Sie explizit auf die Feldwerte zugreifen und diese formatieren:

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

Diese geänderte String()-Funktion verursacht keine unendliche Rekursion mehr und gibt die Werte der verschachtelten Strukturelemente korrekt aus .

Alternativ können Sie die String()-Methode in der verschachtelten Daemon-Struktur überschreiben, um die Rekursion zu verhindern:

func (d daemon)String() string {
    return fmt.Sprintf("Loglevel: %d, Logfile: %s\n", d.Loglevel, d.Logfile)
}
Nach dem Login kopieren

Durch das Überschreiben der String()-Methode in der verschachtelten Struktur kommt es zu einem Fehler die rekursive Aufrufkette und stellen Sie sicher, dass die String()-Funktion nur die Werte der verschachtelten Struktur selbst ausgibt und nicht alle ihre enthaltenden Strukturen.

Das obige ist der detaillierte Inhalt vonWarum führt die Verwendung von „% v' in einer „String()'-Methode zu einer unendlichen Rekursion mit verschachtelten 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
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!