pointers - 如何将不同的错误接口(interface)实现存储在一起,然后在 Go 中使用它们进行类型比较?

标签 pointers go error-handling interface

我正在尝试在 go 中编写一个表测试,其中测试用例将导致不同的错误。然后,我想使用 errors.As() 检查错误类型是否与测试用例中定义的错误类型匹配。每个测试用例都由一个结构体定义,因此结构体中需要有一个类型可以保存接口(interface) error 的任何实现,然后也可以验证在测试。

我尝试按如下方式定义结构

type testCase struct {
        testInput string
        expectedError error
}

我还有许多实现 error 接口(interface)的自定义错误,假设其中一个名为 myCustomError

然后我声明该结构的变量,如下所示:

mTest := testCase{
        testInput: "some failing string",
        expectedError: myCustomError{},
}

如果我然后像这样进行测试...

err := someFunc(mTest.testInput)
if errors.As(err, &mTest.expectedError) {
        // test have succeeded
}

... if 语句将始终返回 true,无论返回哪种自定义错误类型。

我在 Go Playground 上做了一个最小的例子:https://play.golang.org/p/uMdbMvfcdQi

在 Playground 示例中,我希望字符串“matching myError1”打印两次,但当该值存储为普通 error 时,它也会匹配 myError2在用于检查变量 err 的类型之前。
甚至可以做这样的事情吗?

最佳答案

在测试用例中存储指向目标值的指针。

type testCase struct {
    testInput string
    expectedError interface{}
}

mTest := testCase{
    testInput: "some failing string",
    expectedError: &myCustomError{},
}

err := someFunc(mTest.testInput)
if errors.As(err, mTest.expectedError) {
    // test have succeeded
}

最小示例:https://play.golang.org/p/igJy9L_ui73

关于pointers - 如何将不同的错误接口(interface)实现存储在一起,然后在 Go 中使用它们进行类型比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58555683/

相关文章:

go - 为什么带有文件上传的 HTTP 请求在第一次请求时失败(仅)?

error-handling - Selenium IDE自定义错误消息

Python:os.system() 没有返回或错误

c# - RavenDB 错误 : I can't access var store from a different class. 任何建议

c - C中两个函数之间的指针

c++ - 如何通过 MessageBox 输出一个指针?

Golang - 文本/模板返回键值

qt - 有效方法以红色高亮显示 'Unresolved Reference'

c++ - 如何在C++中实现通用指针类型

C++ char* 与 int*