为了账号安全,请及时绑定邮箱和手机立即绑定

TypeOf 与 Comparable 错误。是

TypeOf 与 Comparable 错误。是

Go
catspeake 2022-10-24 16:29:31
我正在学习 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


查看完整回答
反对 回复 2022-10-24
  • 1 回答
  • 0 关注
  • 121 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信