这不应该失败,因为两个错误具有相同的字符串,但它仍然失败:
if !errors.Is(err, testspec.expectErr) {
t.Errorf("Error mismatch, want %v, get %v", testspec.expectErr, err)
}
这是 Is() 函数调用的错误:
func Is(err, target error) bool {
if target == nil {
return err == target
}
isComparable := reflectlite.TypeOf(target).Comparable()
for {
if isComparable && err == target {
return true
}
if x, ok := err.(interface{ Is(error) bool }); ok && x.Is(target) {
return true
}
// TODO: consider supporting target.Is(err). This would allow
// user-definable predicates, but also may allow for coping with sloppy
// APIs, thereby making it easier to get away with them.
if err = Unwrap(err); err == nil {
return false
}
}
}
errors.Is
不检查错误字符串是否相同。假设错误是使用创建的errors.New
,这是记录的行为:
From https://pkg.go.dev/errors#New https://pkg.go.dev/errors#New
func New(text string) error
New 返回一个错误,格式为
给定的文本。即使文本相同,每次调用 New 都会返回一个不同的错误值。
从您添加到问题中的附加代码来看,您似乎认为这两个&errorString{"block #11 not found"}
值应该比较相等。但这是两个指针,并且(来自“比较运算符”下的语言参考):
指针值具有可比性。两个指针值相等,如果
指向同一个变量或者两者的值均为 nil。指向的指针
不同的零大小变量可能相等也可能不相等。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)