gpt4 book ai didi

go - 错误。is(...)不对称❓

转载 作者:行者123 更新时间:2023-12-03 10:09:46 24 4
gpt4 key购买 nike

我试图找到比较errors的正确方法,发现一些奇怪的行为

type errorOne struct{}

func (e errorOne) Error() string {
return "Error One"
}
e1 := errorOne{}
e2 := fmt.Errorf("E2: %w", errorOne{}) // return 'error' interface
res1 := e1 == e2 // false
res2 := errors.Is(e1, e2) // false
res3 := errors.Is(e2, e1) // true
看起来 errors.Is(...)不对称(或者我不了解方法行为)。
怎么了?

最佳答案

errors.Is() ,而不是,是一种“等于”实现,而是一种“被包装”的检查。e2包装e1,但是e1不包装e2。那么,为什么errors.Is()是对称的呢? “包装”是一种单向关系;例如有母女关系,但母亲的母亲不是女儿。
一个包装的错误可能会被另一个包装,从而创建一个“链”。 errors.Is()基本上告诉您给定的错误是否属于该“链”的一部分。
请注意,您可以使用 errors.Unwrap() “提取”包装的错误,例如:

fmt.Println(e2)
fmt.Println(errors.Unwrap(e2))
fmt.Println(errors.Unwrap(errors.Unwrap(e2)))
这将输出(在 Go Playground上尝试):
E2: Error One
Error One
<nil>
第三行是 <nil>,因为 errors.Unwrap(e2)返回 e1(更具体地说是 e1的副本),并且它不包装任何错误。
阅读博客文章了解更多详细信息: The Go Blog: Working with Errors in Go 1.13

关于go - 错误。is(...)不对称❓,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64263927/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com