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 !
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 ?
Ce n’est pas le cas. Dans les deux premiers cas, il signale correctement l'erreur comme Error
和 interface{}
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!