Maison >développement back-end >Golang >Erreur lors de la comparaison dans Golang

Erreur lors de la comparaison dans Golang

王林
王林avant
2024-02-12 08:20:071071parcourir

在 Golang 中比较时出现错误

Lorsque vous effectuez des opérations de comparaison dans Golang, vous rencontrez parfois des erreurs. Ces erreurs peuvent entraîner un dysfonctionnement du programme ou produire des résultats inattendus. Cet article utilisera l'introduction de l'éditeur PHP Strawberry pour analyser les erreurs qui peuvent survenir lors de la comparaison dans Golang et fournir les solutions correspondantes. En comprenant ces erreurs courantes, nous pouvons mieux comprendre et utiliser les opérations de comparaison de Golang et améliorer la stabilité et l'exactitude du programme. Explorons ensemble !

Contenu de la question

Aujourd'hui, j'ai rencontré un problème en essayant d'implémenter une erreur personnalisée. Mon service comporte deux types d'erreurs : les erreurs générales pour les erreurs internes et les erreurs utilisateur pour la gestion des erreurs liées à l'utilisateur. J'ai donc une structure pour les erreurs utilisateur qui contient des métadonnées et des fonctions pour gérer les erreurs. Dans cette fonction, j'utilise un wrapper pour l'erreur standard. Comme fonction. Mais la façon dont cela fonctionne est étrange : pour une raison quelconque, il traite également les erreurs courantes comme des erreurs utilisateur. Voici l'extrait de code :

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

Ici, je teste une fonction qui accepte deux erreurs et les compare (As et AsV2). La seule différence est que la deuxième fonction accepte l'interface de l'erreur cible au lieu du type d'erreur. Dans la fonction IsUserError, je crée manuellement le pointeur UserError et le fournisse à la fonction Errors.As. Mais lors de la sortie de ce programme, j'obtiens ceci :

true
true 
false

Ma question est donc de savoir pourquoi l'erreur se produit dans les deux premiers cas. Autrement dit, c'est le même type d'erreur, mais ce n'est que dans le troisième cas que cela donne la bonne réponse ? Est-ce que je comprends mal le fonctionnement des interfaces dans Go ?

Solution

Ce n’est pas le cas. Dans les deux premiers cas, il signale correctement l'erreur comme Errorinterface{} respectivement. La fonction wrapper inutile que vous avez ajoutée crée une indirection qui la rend encore plus déroutante, mais si vous appelez :

var emptyError *UserError
fmt.Println(errors.As(userError, emptyError))

Vous obtenez les résultats attendus. IsUserError 按预期工作,因为它将正确的类型传递给 errors.Is。我已经清理了您的代码以正常工作(Error 采用非指针接收器,并且不将 emptyError 保留为 nil), vous pouvez le voir en action ici : 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))
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer