我正在学习 Go 中的错误比较是如何工作的,并发现了一些我无法理解的东西。函数errors.Is(err, target error)检查目标是否可比较。func Is(err, target error) bool { if target == nil { return err == target } isComparable := reflectlite.TypeOf(target).Comparable() for { if isComparable && err == target { return true }资源鉴于 Go 中的所有接口都是可比较的并且error是一个接口,这个调用处理哪种情况?
1 回答
慕莱坞森
TA贡献1810条经验 获得超4个赞
接口值是可比较的,但比较可能会在运行时出现混乱。规范说:
如果该类型的值不可比较,则比较具有相同动态类型的两个接口值会导致运行时恐慌。
当目标的具体类型不可比较时,该检查通过跳过比较来防止恐慌。
这是一个例子:
type E []byte
func (e E) Error() string { return string(e) }
func (e E) Is(target error) bool {
t, ok := target.(E)
return ok && bytes.Equal(e, t)
}
var a error = E{}
var b error = E{}
fmt.Println(errors.Is(a, b)) // prints true
fmt.Println(a == b) // panics because slices are not comparable
- 1 回答
- 0 关注
- 121 浏览
添加回答
举报
0/150
提交
取消