登录
首页 >  Golang >  Go问答

如何在golang中比较两个错误是否相等

来源:stackoverflow

时间:2024-02-10 08:54:26 374浏览 收藏

各位小伙伴们,大家好呀!看看今天我又给各位带来了什么文章?本文标题《如何在golang中比较两个错误是否相等》,很明显是关于Golang的文章哈哈哈,其中内容主要会涉及到等等,如果能帮到你,觉得很不错的话,欢迎各位多多点评和分享!

问题内容

我在 errdefs.go 中有一个简单的错误包装类型:

package errdefs

type errinvalidattribute struct{ error }

func (e errinvalidattribute) unwrap() error {
    return e.error
}

func invalidattribute(err error) error {
    if err == nil || isinvalidattribute(err) {
        return err
    }
    return errinvalidattribute{err}
}

func isinvalidattribute(err error) bool {
    return errors.as(err, &errinvalidattribute{})
}

以下是该文件的单元测试:

package errdefs_test

func testwraperrorequal(t *testing.t) {
    err1 := errdefs.invalidattribute(fmt.errorf("this is a wrap error"))
    err2 := errdefs.invalidattribute(fmt.errorf("this is a wrap error"))
    if err1 != err2 {
        t.errorf(" != now work")
    }

    if !errors.is(err1, err2) {
        t.errorf("errors.is not work")
    }
}

然后我运行单元测试:

$ go test .
--- FAIL: TestInvali (0.00s)
    errdefs_test.go:62: != not work
    errdefs_test.go:66: errors.Is not work
FAIL
FAIL    errdefs 0.496s
FAIL

!=errors.is 不能很好地工作,那么如何检查 golang 中两个换行错误是否相等?


正确答案


相等运算符以及 errors.is 检查错误对象引用的相等性。因此,两个实例化的错误对象永远不会相等。

大多数库在启动时实例化错误变量并使用引用进行相等性检查。

var (
  errinvalidargument = errors.new("invalid argument")
)

func errinvalidargument(err error) bool {
  return err == errinvalidargument
}

当然,如果不是动态汇编的话,你也可以检查error#error返回的字符串是否相等。

因此,您的测试函数将如下所示。

func TestWrapErrorEqual(t *testing.T) {
    wrappedErr := fmt.Errorf("this is a wrap error")
    err1 := errdefs.InvalidAttribute(wrappedErr )
    err2 := errdefs.InvalidAttribute(wrappedErr )
    if err1.Unwrap() != err2.Unwrap() {
        t.Errorf(" != now work")
    }

    if !errors.Is(err1.Unwrap(), err2.Unwrap()) {
        t.Errorf("errors.Is not work")
    }
}

我希望我的问题是正确的,这会有所帮助。

本篇关于《如何在golang中比较两个错误是否相等》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

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