In Go werden Ausnahmesituationen typischerweise mithilfe von Fehlerwerten behandelt, die die Fehlerschnittstelle implementieren. Die Error()-Methode der Schnittstelle gibt eine Zeichenfolge zurück, die den Fehler beschreibt.
Bei der Arbeit mit benutzerdefinierten Fehlertypen ist es jedoch wichtig, eine Rekursion in der Error()-Methode zu vermeiden.
Stellen Sie sich einen benutzerdefinierten Fehlertyp vor, bei dem die Methode Error() fmt.Sprint(e) aufruft, um den Fehlerwert in eine Zeichenfolge umzuwandeln. Dieser Ansatz stellt ein potenzielles Problem dar:
type MyError struct { message string } func (e MyError) Error() string { return fmt.Sprint(e) }
Wenn Sie nun versuchen, den Fehler auszudrucken, kommt es zu einer Endlosschleife:
func main() { err := MyError{"Error!"} fmt.Println(err) }
Dies geschieht, weil fmt.Sprint(e) e aufruft .Error(), was wiederum fmt.Sprint(e) erneut aufruft, und so weiter.
Um die Rekursion zu unterbrechen, konvertieren Sie e in einen Wert, der keine String- oder Error-Methode hat, bevor Sie ihn an fmt.Sprint übergeben:
func main() { err := MyError{"Error!"} fmt.Println(fmt.Sprint(float64(err))) }
In diesem Beispiel wird die Konvertierung von e zu einem float64 entfernt seine String- und Error-Methoden und verhindert so die Endlosschleife.
Das obige ist der detaillierte Inhalt vonWie kann ich Endlosschleifen bei der Behandlung benutzerdefinierter Fehler in Go verhindern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!