Heim  >  Artikel  >  Backend-Entwicklung  >  Fehler beim Vergleich in Golang

Fehler beim Vergleich in Golang

王林
王林nach vorne
2024-02-12 08:20:071031Durchsuche

在 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>

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?

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

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen