Go 1.20 的 errors.Join 适合简单聚合多个错误,支持嵌套、遍历及 errors.Is/As 判断;自定义错误结构适用于需携带上下文、分类或可恢复行为的场景;二者可组合使用。
Go 1.20 引入了 errors.Join,为处理多个错误提供了标准、简洁的方式;而自定义错误结构则适合需要携带上下文、分类或可恢复行为的场景。二者不互斥,可根据实际需求选择或组合使用。
errors.Join 将零个或多个错误合并为一个实现了 error 接口的值,支持嵌套、遍历和判断是否包含某类错误(配合 errors.Is 或 errors.As)。它轻量、无副作用,适合“尽力执行 + 收集失败”的场景,比如批量操作、资源清理等。
示例:关闭多个文件时收集所有关闭错误
func closeAll(files ...*os.File) error {
var errs []error
for _, f := range files {
if err := f.Close(); er
r != nil {
errs = append(errs, fmt.Errorf("closing %s: %w", f.Name(), err))
}
}
return errors.Join(errs...)
}
调用后可统一检查:
if err == nil
errors.Is(err, os.ErrClosed)(只要任一子错误匹配即为 true)var pathErr *os.PathError; if errors.As(err, &pathErr) { ... }
当多个错误需区分来源、优先级、是否可忽略,或需附带字段(如失败项索引、重试次数、HTTP 状态码)时,定义结构体更清晰。注意实现 Error() 方法,并可选择性实现 Unwrap() 以支持 errors.Is/As。
示例:批量更新用户返回结构化错误
type BatchUpdateError struct {
FailedIDs []int64
Cause error // 底层原因(可选)
}
func (e *BatchUpdateError) Error() string {
return fmt.Sprintf("failed to update %d users: %v", len(e.FailedIDs), e.Cause)
}
func (e *BatchUpdateError) Unwrap() error { return e.Cause }
// 使用
if len(failed) > 0 {
return &BatchUpdateError{FailedIDs: failed, Cause: firstErr}
}
这样调用方能直接访问 .FailedIDs 做重试或日志,也能用 errors.Is 判断是否由数据库超时导致。
errors.Join
Unwrap
errors.Join 内部是链表,大量错误可能影响遍历效率;此时可考虑只保留前 N 个或聚合统计不必二选一。例如在自定义错误中,把子错误用 errors.Join 合并后再存入字段:
type ValidationErrors struct {
FieldErrors map[string]error // 字段级错误
GlobalErr error // 其他非字段错误(如网络超时)
}
func (e *ValidationErrors) Error() string {
return "validation failed"
}
func (e *ValidationErrors) Unwrap() error {
// 合并所有子错误供 errors.Is 使用
errs := make([]error, 0, len(e.FieldErrors)+1)
for _, err := range e.FieldErrors {
errs = append(errs, err)
}
if e.GlobalErr != nil {
errs = append(errs, e.GlobalErr)
}
return errors.Join(errs...)
}
这样既保持结构清晰,又不失标准错误生态的便利性。
# go
# golang
# app
# 工具
# ai
# 状态码
# if
# Error
# 结构体
# 接口
# var
# nil
# 数据库
# http
# 多个
# 自定义
# 遍历
# 重试
# 结构化
# 或可
# 判断是否
# 第一个
# 只需
# 适用于
相关文章:
如何配置WinSCP新建站点的密钥验证步骤?
网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?
制作充值网站的软件,做人力招聘为什么要自己交端口钱?
建站VPS推荐:2025年高性能服务器配置指南
建站OpenVZ教程与优化策略:配置指南与性能提升
如何制作算命网站,怎么注册算命网站?
c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】
专业网站建设制作报价,网页设计制作要考什么证?
山东网站制作公司有哪些,山东大源集团官网?
如何快速上传建站程序避免常见错误?
h5网站制作工具有哪些,h5页面制作工具有哪些?
jQuery 常见小例汇总
建站主机是否属于云主机类型?
如何在Golang中引入测试模块_Golang测试包导入与使用实践
网站制作新手教程,新手建设一个网站需要注意些什么?
成都网站制作报价公司,成都工业用气开户费用?
javascript中的try catch异常捕获机制用法分析
建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析
如何快速搭建高效可靠的建站解决方案?
如何在橙子建站上传落地页?操作指南详解
小说建站VPS选用指南:性能对比、配置优化与建站方案解析
建站之星会员如何解锁更多建站功能?
建站之星导航菜单设置与功能模块配置全攻略
建站之星备案流程有哪些注意事项?
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
个人网站制作流程图片大全,个人网站如何注销?
如何在局域网内绑定自建网站域名?
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
如何正确下载安装西数主机建站助手?
宝塔新建站点为何无法访问?如何排查?
建站之星导航配置指南:自助建站与SEO优化全解析
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
如何通过商城自助建站源码实现零基础高效建站?
网站制作员失业,怎样查看自己网站的注册者?
建站10G流量真的够用吗?如何应对访问高峰?
微信h5制作网站有哪些,免费微信H5页面制作工具?
网站微信制作软件,如何制作微信链接?
如何在阿里云购买域名并搭建网站?
广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?
平台云上自主建站:模板化设计与智能工具打造高效网站
中山网站推广排名,中山信息港登录入口?
为什么Go需要go mod文件_Go go mod文件作用说明
建站之星代理如何获取技术支持?
网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?
C#如何在一个XML文件中查找并替换文本内容
公司网站制作价格怎么算,公司办个官网需要多少钱?
如何通过虚拟机搭建网站?详细步骤解析
重庆网站制作公司哪家好,重庆中考招生办官方网站?
如何快速辨别茅台真假?关键步骤解析
建站之星安装步骤有哪些常见问题?
*请认真填写需求信息,我们会在24小时内与您取得联系。