如何在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 包引入了 IsAs 函数,用来更准确地进行错误比较和类型断言,尤其是在使用错误包装(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.Iserrors.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


相关推荐: 快递优选如何查优选物流_快递优选专属物流渠道查询与配送时效  edge浏览器怎么修改语言为中文_Edge界面语言切换教程  Flash AS3.0简易相册制作  发布小红书怎么屏蔽粉丝?屏蔽粉丝能看到吗?  以下哪一个是适应长期护理制度发展而设立的新职业  抖音如何进行蓝V认证 抖音企业号申请所需资料与流程  rabbitmq 持久化有什么缺点?  《漫蛙manwa2》防走失网页版链接2025  智云Q3和Q2有什么升级_智云Q3与Q2手持云台功能与性能对比分析  QQ邮箱PC端登录页面_QQ邮箱网页版登录界面  2025考研成绩查询时间入口分享  Lar*el怎么实现全文搜索_Lar*el Scout集成Algolia教程  ao3入口镜像地址 ao3镜像入口可靠跳转  在React中正确处理HTML input type="number"的数值类型  mysql中如何配置字符集和排序规则_mysql字符集排序配置  J*aScript模块加载器_RequireJS原理分析  cad加载的线型看不见怎么办_cad线型不可见问题解决方法  VS Code快捷键when上下文子句的妙用  PHP安全加载非公开目录图片与动态内容类型处理指南  Go Goroutine调度与并发执行深度解析  精通VS Code多光标编辑以实现闪电般快速的修改  鲨鱼剧场app金币获取方法  视频转蓝光m2ts格式  在VS Code中利用AI辅助进行代码迁移  广州地铁app准妈咪徽章领取方法  Golang如何使用log记录日志信息_Golang log日志记录方法总结  Mac怎么关闭按键声音_Mac键盘打字音效设置  怎样让Windows 11的开始菜单恢复经典样式_Open-Shell工具使用指南【怀旧】  响应式设计中动态背景颜色条的实现指南  手机坏了微信聊天记录怎么导出来 新手机恢复聊天记录技巧  《三角洲行动》战斗步枪与机枪类改装代码分享  VS Code中的Tailwind CSS IntelliSense插件使用技巧  英雄联盟争者留名活动介绍  管理打开的编辑器:固定、分组和关闭技巧  抖音怎么解除第三方绑定_抖音解除第三方平台绑定方法介绍  PHP动态导航按钮:根据用户登录状态切换链接与文本  跨语言测试实践:使用Python Selenium测试现有J*a Web项目  Cassandra中复合主键、二级索引与ORDER BY排序的限制与解决方案  解决Go encoding/json 将JSON大数字解析为浮点数的问题  酷狗音乐多音轨设置教程  Magento 2 产品保存事件中安全更新属性的最佳实践  我居然低估了 DeepSeek,这次更新它做到了这些!  Python实时数据流中高效查找最大最小值  抖音团长模式怎么做?团长模式是什么意思?  风车动漫官网首页入口登录 风车动漫在线观看正版地址  微博网页版访问入口 微博网页版网页端使用指南  Dash应用中自定义HTML页面标题与网站图标(F*icon)的实用指南  Yandex世界探索 最新官方免登录入口全知道  Python自动化抓取GBGB赛狗比赛结果:日期范围与赛道筛选教程  苹果如何下载nanobanana 

 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.