如何在golang中比较错误

4

背景: 我正在进行单元测试,并尝试检查是否出现了预期的错误。

由于没有得到预期结果,因此我尝试了一些简单的方法,比较精确的错误,并惊讶地发现比较结果返回了“false”。

e1 := errors.New("error")
e2 := errors.New("error")
fmt.Println(e1 == e2) // false

运行示例:https://play.golang.org/p/cvjjiJT_5T

有人能解释一下为什么这会返回false,以及如何正确地检查错误之间的相等性吗?


3
errors.New函数返回值的指针。e1/e2是指向不同值的不同指针。等式测试必然为假,因为它将检查指针地址而不是内部值。可以使用%#v格式来查看这一点。请改用强类型错误和类型断言。 - user4466350
你可以查看 https://github.com/stretchr/testify 单元测试库。它包含了一些函数,例如 assert.Equal(t, err1, err2),可以以正确的方式处理错误比较。 - sonan
1个回答

12

您正在创建两个带有相同错误消息的不同错误变量。当您使用 == 进行比较时,由于它们不是相同的变量,您会得到 false

如果您想比较错误消息,请尝试e1.Error()==e2.Error()。然而,比较错误消息仍然不是一个好主意。您可以考虑创建一些错误常量(例如e1==ErrContentNotFound)或向您的错误添加一些ID并进行比较(例如e1.ID==ContentNotFoundID)。请访问https://dave.cheney.net/2016/04/07/constant-errors(以及该链接中的相关文章)了解更多详情。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接