TypeOf 与 Comparable 错误。是

我正在学习 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是一个接口,这个调用处理哪种情况?


catspeake
浏览 122回答 1
1回答

慕莱坞森

接口值是可比较的,但比较可能会在运行时出现混乱。规范说:如果该类型的值不可比较,则比较具有相同动态类型的两个接口值会导致运行时恐慌。当目标的具体类型不可比较时,该检查通过跳过比较来防止恐慌。这是一个例子:type E []bytefunc (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 truefmt.Println(a == b)          // panics because slices are not comparable
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go