Bei der Durchführung von Vergleichsoperationen in Golang treten manchmal Fehler auf. Diese Fehler können dazu führen, dass sich das Programm nicht ordnungsgemäß verhält oder unerwartete Ergebnisse liefert. In diesem Artikel wird die Einführung des PHP-Editors Strawberry verwendet, um die Fehler zu analysieren, die beim Vergleich in Golang auftreten können, und entsprechende Lösungen bereitzustellen. Durch das Verständnis dieser häufigen Fehler können wir die Vergleichsoperationen von Golang besser verstehen und nutzen und die Stabilität und Korrektheit des Programms verbessern. Lasst uns gemeinsam erkunden!
Heute bin ich beim Versuch, einen benutzerdefinierten Fehler zu implementieren, auf ein Problem gestoßen. Mein Dienst weist zwei Arten von Fehlern auf: reguläre Fehler für interne Fehler und Benutzerfehler für die Behandlung benutzerbezogener Fehler. Ich habe also eine Struktur für Benutzerfehler, die einige Metadaten und Funktionen zur Behandlung der Fehler enthält. In dieser Funktion verwende ich einen Wrapper für Standardfehler. Als Funktion. Aber die Art und Weise, wie es funktioniert, ist seltsam: Aus irgendeinem Grund werden häufige Fehler auch als Benutzerfehler behandelt. Hier ist der Codeausschnitt:
<code>package main import ( "errors" "fmt" ) type UserError struct { Message string } func (u *UserError) Error() string { return u.Message } func As(sourceError, targetError error) bool { return errors.As(sourceError, &targetError) } func AsV2(sourceError error, targetError interface{}) bool { return errors.As(sourceError, &targetError) } func IsUserError(err error) bool { var userError *UserError return errors.As(err, &userError) } func main() { userError := errors.New("test Error") var emptyError *UserError fmt.Println(As(userError, emptyError)) fmt.Println(AsV2(userError, emptyError)) fmt.Println(IsUserError(userError)) } </code>
Hier teste ich eine Funktion, die zwei Fehler akzeptiert und vergleicht (As und AsV2). Der einzige Unterschied besteht darin, dass die zweite Funktion die Schnittstelle des Zielfehlers anstelle des Fehlertyps akzeptiert. In der Funktion IsUserError erstelle ich manuell den UserError-Zeiger und stelle ihn der Funktion Errors.As zur Verfügung. Aber wenn ich dieses Programm ausgebe, erhalte ich Folgendes:
true true false
Meine Frage ist also, warum der Fehler in den ersten beiden Fällen auftritt. Das heißt, es handelt sich um denselben Fehlertyp, aber nur im dritten Fall gibt er die richtige Antwort? Verstehe ich falsch, wie Schnittstellen in Go funktionieren?
Das ist nicht der Fall. In den ersten beiden Fällen wird der Fehler jeweils korrekt als Error
和 interface{}
gemeldet. Die unnötige Wrapper-Funktion, die Sie hinzugefügt haben, erzeugt eine Indirektion, die es noch verwirrender macht, aber wenn Sie Folgendes aufrufen:
var emptyError *UserError fmt.Println(errors.As(userError, emptyError))
Sie erhalten die erwarteten Ergebnisse. IsUserError
按预期工作,因为它将正确的类型传递给 errors.Is
。我已经清理了您的代码以正常工作(Error
采用非指针接收器,并且不将 emptyError
保留为 nil
), Sie können es hier in Aktion sehen: https://go.dev/play/p/c5EPB5IGeD5
type UserError struct { Message string } func (u UserError) Error() string { return u.Message } func main() { userError := errors.New("test Error") var emptyError UserError fmt.Println(errors.As(userError, &emptyError)) }
Das obige ist der detaillierte Inhalt vonFehler beim Vergleich in Golang. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!