如何在Golang中判断错误类型_Golang errors包中Is与As函数使用


答案:Go 1.13引入errors.Is和errors.As用于处理包装错误。1. errors.Is判断错误值是否匹配目标,可穿透多层包装,适用于识别预定义错误如os.ErrNotExist。2. errors.As判断错误链中是否存在指定类型并赋值,适用于提取自定义错误类型的字段或方法。两者均能正确处理错误包装,避免传统==或类型断言无法穿透包装的问题,提升错误处理的准确性和健壮性。

如何在golang中判断错误类型_golang errors包中is与as函数使用

在Go语言中处理错误时,经常需要判断一个错误是否属于特定类型或是否包装了某个目标错误。从Go 1.13开始,errors 包引入了 Is 和 As 函数,用来更准确地进行错误比较和类型断言,尤其是在使用错误包装(error wrapping)的场景下。

errors.Is:判断两个错误是否相等

errors.Is(err, target) 用于判断 err 是否与 target 错误相同,或者是否被包装在错误链中的某一层。

它会递归地检查错误链,只要其中任意一层匹配目标错误,就返回 true。

常见用途是判断是否为预定义的错误变量,比如:

  • 网络超时错误
  • 文件不存在错误
  • 自定义的业务错误码

示例:

package main

import (
    "errors"
    "fmt"
    "os"
)

func main() {
    _, err := os.Open("nonexistent.txt")
    if errors.Is(err, os.ErrNotExist) {
        fmt.Println("文件不存在")
    }
}

这里即使 os.Open 返回的是一个包装了 os.ErrNotExist 的错误,errors.Is 也能正确识别。

errors.As:将错误链中某个类型的错误赋值给变量

errors.As(err, &target) 用于判断错误链中是否包含某个特定类型的错误,并将其赋值给目标变量。

这在你需要访问错误的具体字段或方法时非常有用。

Primeshot Primeshot

专业级AI人像摄影工作室

Primeshot 36 查看详情 Primeshot

例如,自定义一个带有错误码的结构体:

type MyError struct {
    Code int
    Msg  string
}

func (e *MyError) Error() string {
    return fmt.Sprintf("[%d] %s", e.Code, e.Msg)
}

当这个错误被包装后,仍可用 errors.As 提取:

func main() {
    err := fmt.Errorf("wrap: %w", &MyError{Code: 404, Msg: "not found"})
    
    var myErr *MyError
    if errors.As(err, &myErr) {
        fmt.Printf("错误码: %d, 消息: %s\n", myErr.Code, myErr.Msg)
    }
}

上面代码中,errors.As 遍历错误链,一旦发现可赋值给 *MyError 的实例,就将其赋值给 myErr。

Is 与 As 的区别总结

两者都用于处理包装错误,但用途不同:

  • errors.Is 类似于“错误值比较”,适用于判断是否等于某个已知错误值(如 os.ErrNotExist)
  • errors.As 类似于“类型断言”,适用于提取错误中的具体类型以便访问其字段或方法

不要用传统的 == 或 type assertion 来替代它们,因为那样无法穿透错误包装层。

基本上就这些。合理使用 errors.Is 和 errors.As 能让错误处理更清晰、更健壮,特别是在大型项目中处理复杂错误链时尤为重要。

以上就是如何在Golang中判断错误类型_Golang errors包中Is与As函数使用的详细内容,更多请关注其它相关文章!


# golang  # go语言  # go  # 想要的网站推广版  # 紫金优化网站制作教程  # 招商网站建设小程序  # 海外推广营销系统简称  # 营销类文本推广方案  # 福清效果好的seo  # seo优化排名软件分类  # 长岛功能性推广营销推广  # 长治网站建设推广公司电话  # 石材行业网站seo引流  # 装了  # 类似于  # 不存在  # 包中  # 链中  # 是在  # 器中  # 自定义  # 适用于  # 递归  # 区别  # ai  # app 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894 】


相关推荐: 抖音如何进行蓝V认证 抖音企业号申请所需资料与流程  Excel宏怎么删除_Excel中删除宏的详细操作流程  快递优选如何查优选物流_快递优选专属物流渠道查询与配送时效  Python中对象引用与链表属性赋值的机制解析  163邮箱网页版入口 163邮箱在线使用  《顺丰同城骑士》查看我的技能方法  《下一站江湖2》大雪山加入方法  WooCommerce购物车:强制显示所有交叉销售商品教程  《微信》视频号原创声明开启方法  吃完饭就犯困是什么原因 餐后嗜睡如何缓解  J*a中为什么强调组合优于继承_组合模式带来的灵活性与可维护性解析  《撕歌》会员开通方法  QQ邮箱PC端登录页面_QQ邮箱网页版登录界面  批改网网页版登录 批改网电脑版学生登录入口  精通VS Code多光标编辑以实现闪电般快速的修改  《爱南宁》认证电动车方法  《爱笔思画x》涂色教程  实时数据流中高效查找最小值与最大值  咸鱼怎么设置仅粉丝可见的动态_咸鱼动态粉丝可见设置方法  《战地6》反作弊已成功拦截240万次作弊 发售第一周98%比赛没有作弊  《饿了么》拼好饭点外卖教程2025  vivo云服务一直提示空间不足怎么办 怎么办vivo云服务老是提示空间不足  顺丰快递在线查询系统 顺丰快递官方查单入口  抖音号升级成企业资质怎么弄?有什么好处?  vivo浏览器怎么离线保存网页 vivo浏览器下载完整页面以便无网络时阅读  diskgenius分区工具如何设置Bios启动项  三角洲行动2025年9月10日摩斯密码分享  J*a列表元素格式化输出教程  如何在CSS中使用伪类:valid实现表单验证提示_结合:valid改变边框颜色  Win10显卡驱动安装失败怎么办 Win10使用DDU彻底卸载驱动【解决】  《磁力猫》最好用的磁官网  掌握产品代码正则表达式:避免常见陷阱与精确匹配  J*aScript字符串_Unicode处理  百度地图离线地图无法加载如何解决 百度地图离线地图加载优化方法  漫蛙manwa漫画官网链接_漫蛙manwa最新可用网址推荐  lol小红书怎么|直播|?lol小红书|直播|是什么意思?  使用jQuery精确检测除指定元素外任意位置的点击事件  sublime怎么快速在浏览器中预览HTML_sublime配置View in Browser教程  《三国:谋定天下》平民全阶段通用阵容  创客贴登录页面入口 创客贴网页版最新网址链接  如何修改Windows截图的默认保存位置_告别C盘让桌面更整洁【教程】  《金山词霸》语音翻译方法  抖音号显示企业机构号是什么意思?企业机构号申请条件是什么?  《大润发优鲜》充值方法介绍  苹果电脑如何快速查看电池状态 苹果电脑电池信息快捷方法  青橙手机语音助手怎么唤醒_青橙手机语音助手设置与唤醒方法  申通快递查询 申通物流快递单实时查询入口  Go Goroutine调度与并发执行深度解析  C++怎么实现一个红黑树_C++高级数据结构与平衡二叉搜索树  Eclipse开发J*a快速入门 

 2025-11-19

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.