Fehler beim Vergleich in Golang

王林
Freigeben: 2024-02-12 08:20:07
nach vorne
1037 Leute haben es durchsucht

在 Golang 中比较时出现错误

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!

Frageninhalt

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>
Nach dem Login kopieren

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
Nach dem Login kopieren

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?

Lösung

Das ist nicht der Fall. In den ersten beiden Fällen wird der Fehler jeweils korrekt als Errorinterface{} 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))
Nach dem Login kopieren

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))
}
Nach dem Login kopieren

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!

Quelle:stackoverflow.com
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage