我正在学习如何在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
是一个接口,那么该调用处理哪种情况?
发布于 2022-01-16 08:38:16
接口值是可比较的,但在运行时,比较可能会引起恐慌。The 说明书上说
如果将两个接口值与相同的动态类型进行比较,则如果该类型的值不可比较,则会引起运行时恐慌。
当目标的具体类型不可比较时,检查通过跳过比较来防止恐慌。
下面是一个例子:
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
https://stackoverflow.com/questions/70731980
复制