Maison >développement back-end >Golang >Pourquoi est-ce que je reçois uniquement l'erreur de construction « error.As Should not be *error » pour le deuxième paramètre de mes tests ?

Pourquoi est-ce que je reçois uniquement l'erreur de construction « error.As Should not be *error » pour le deuxième paramètre de mes tests ?

WBOY
WBOYavant
2024-02-08 22:06:20779parcourir

为什么我仅在测试中收到“errors.As should not be *error”构建错误的第二个参数?

éditeur php Zimo, bonjour ! Concernant le problème dans l'erreur de construction que vous avez mentionnée, l'erreur "erreurs. Comme cela ne devrait pas être une erreur" peut avoir plusieurs raisons. Premièrement, cette erreur signifie généralement qu’un mauvais deuxième argument a été utilisé lors de la construction. Vous devez vous assurer que le deuxième paramètre est correct et correspond au type requis. Deuxièmement, il se peut que vous utilisiez les mauvaises données dans votre test. Veuillez examiner attentivement vos données de test et vous assurer qu'elles répondent au format et aux exigences attendus. Enfin, cette erreur peut également être provoquée par des problèmes liés au framework ou à la bibliothèque. Dans ce cas, il est recommandé de consulter la documentation pertinente ou de demander l'aide de la communauté pour trouver une solution. J'espère que ces conseils vous seront utiles !

Contenu de la question

Considérez le test suivant :

import (
    "errors"
    "fmt"
    "testing"
)

func testerror(t *testing.t) {
    err := &myerror{}
    var target error
    fmt.println(errors.as(err, &target))
}

type myerror struct{}

func (err *myerror) error() string {
    return "oops!"
}

L'exécution de ce test générera une erreur de construction second 参数返回到错误。不应为 *error.

Aller au terrain de jeux

Cependant, lorsque vous exécutez exactement le même code dans main, le programme s'exécute sans problème :

package main

import (
    "errors"
    "fmt"
)

func main() {
    err := &myerror{}
    var target error
    fmt.println(errors.as(err, &target))
}

type myerror struct{}

func (err *myerror) error() string {
    return "oops!"
}

Allez au terrain de jeu

Je constate ce comportement dans le terrain de jeu go et dans mon environnement de développement local, tous deux utilisant go 1.20.

Est-ce un bug en cours ?

Modifier

J'ai pu résoudre le problème d'échec de build dans mes tests en créant un error type :

package main

import (
    "errors"
    "fmt"
    "testing"
)

type Error error // <===== Add error type

func TestError(t *testing.T) {
    err := &MyError{}
    var target Error // <===== Use Error type
    fmt.Println(errors.As(err, &target))
}

type MyError struct{}

func (err *MyError) Error() string {
    return "oops!"
}

Solution

Cette erreur est provoquée par la commande go vet 命令报告的。 go test 命令自动运行 go vet 以报告重大问题。 go build 命令不运行 go vet.

Cet avertissement n'est pas un bug dans Go.

Utilisez *error comme deuxième paramètre pour appeler errors.As Oui Cela n'a aucun sens puisque vous savez déjà que le premier paramètre satisfait l'interface *error 作为第二个参数调用 errors.As 是没有意义的,因为您已经知道第一个参数满足 error. Vous faites presque certainement quelque chose de mal.

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