比较Go中的错误

时间:2016-03-18 18:18:09

标签: go

在我的测试文件中,我试图将检测到的实际错误与预期错误进行比较。但是,这种比较评估为假,我不确定为什么。当我创建两个相同的错误并进行比较时,甚至会发生这种情况。

代码段:

func TestCompareErrors(t *testing.T) {
    if fmt.Errorf("Test Error") != fmt.Errorf("Test Error") {
        t.Errorf("Test failed")
    }
}

这会导致“测试失败”

2 个答案:

答案 0 :(得分:3)

您正在比较恰好具有相同错误消息的两个不同值。您希望比较预定义的错误值,就像使用io.EOF等常见值一样。

http://play.golang.org/p/II8ZeASwir

var errTest = fmt.Errorf("test error")

func do() error {
    return errTest
}

func main() {
    err := do()
    if err == errTest {
        log.Fatal("received error: ", err)
    }

}

您可以阅读"Errors are Values"以获得更深入的解释。

如果您需要提供有关错误的更多信息,可以创建自己的错误类型。然后,您可以将所需的任何信息附加到错误中,并通过类型断言检查该类型的错误。

type myError string

func (e myError) Error() string {
    return string(e)
}

func do() error {
    return myError("oops")
}

func main() {
    err := do()
    if err, ok := err.(myError); ok {
        log.Fatal("received myError: ", err)
    }
}

答案 1 :(得分:3)

使用reflect.DeepEqual比较值。

$seq 12 | pr -7ats, | xargs -I X echo "SELECT * FROM Table IN (X)" #or execute mysql
SELECT * FROM Table WHERE id IN (1,2,3,4,5,6,7)
SELECT * FROM Table WHERE id IN (8,9,10,11,12)

playground

中的示例