登录
首页 >  Golang >  Go问答

errors.Is函数在处理具有相同字符串但不同类型的错误时可能返回错误结果

来源:stackoverflow

时间:2024-02-20 21:12:27 163浏览 收藏

golang学习网今天将给大家带来《errors.Is函数在处理具有相同字符串但不同类型的错误时可能返回错误结果》,感兴趣的朋友请继续看下去吧!以下内容将会涉及到等等知识点,如果你是正在学习Golang或者已经是大佬级别了,都非常欢迎也希望大家都能给我建议评论哈~希望能帮助到大家!

问题内容

这不应该失败,因为两个错误具有相同的字符串,但它仍然失败:

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 创建的,这是记录的行为:

来自https://pkg.go.dev/errors#New

从您添加到问题中的附加代码来看,您似乎认为两个 &errorString{"block #11 not found"} 值应该比较相等。但这是两个指针,并且(来自“比较运算符”下的语言参考):

今天关于《errors.Is函数在处理具有相同字符串但不同类型的错误时可能返回错误结果》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>