You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言errors包Is函数中单次执行循环体的for循环作用是什么?

Go errors.Is函数中单次执行的for循环设计目的

先看给出的errors.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
        }
        switch x := err.(type) {
        case interface{ Unwrap() error }:
            err = x.Unwrap()
            if err == nil {
                return false
            }
        case interface{ Unwrap() []error }:
            for _, err := range x.Unwrap() {
                if Is(err, target) {
                    return true
                }
            }
            return false
        default:
            return false
        }
    }
}

当这个for循环仅执行一次时,它的核心设计目的是用统一的循环结构处理“当前错误直接匹配”和“需要解包后匹配”的逻辑,避免代码冗余。

具体来说:

  • 循环首次执行时,会先检查当前err是否直接匹配target:要么是可比较类型且两者相等,要么err自身实现了Is方法并返回true。如果匹配成功,直接返回true,循环结束。
  • 如果当前err不匹配,就尝试解包(Unwrap):如果err不支持任何Unwrap接口,或者Unwrap后得到nil,就直接返回false,循环也仅执行这一次。

这种设计的好处是,不管错误是否需要解包、需要解包多少次,都能复用同一套“检查当前err→尝试解包”的逻辑,不用单独写一段“检查当前err”的代码再处理解包分支,让代码结构更简洁一致。

内容的提问来源于stack exchange,提问作者Jingyi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 23:30:57