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 }
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) }
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) }
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) }
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!