首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >TypeOf与errors.Is的可比性

TypeOf与errors.Is的可比性
EN

Stack Overflow用户
提问于 2022-01-16 16:30:33
回答 1查看 105关注 0票数 1

我正在学习如何在Go中进行错误比较,并发现一些我无法理解的东西。

函数errors.Is(err, target error)检查目标是否具有可比性。

代码语言:javascript
代码运行次数:0
运行
复制
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是一个接口,那么该调用处理哪种情况?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-16 16:38:16

接口值是可比较的,但在运行时,比较可能会引起恐慌。The 说明书上说

如果将两个接口值与相同的动态类型进行比较,则如果该类型的值不可比较,则会引起运行时恐慌。

当目标的具体类型不可比较时,检查通过跳过比较来防止恐慌。

下面是一个例子:

代码语言:javascript
代码运行次数:0
运行
复制
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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70731980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档