网易首页 > 网易号 > 正文 申请入驻

Go 1.20的隐藏武器:错误聚合何时用

0
分享至

你刚修好邮箱格式,提交。系统报错"密码太短"。修完密码,提交。又报"国家代码无效"。再修,再报"必须同意条款"。四个来回,每次只看到一个错误——因为你的函数遇到第一个错误就返回,后面的校验根本没跑。

这是Go 1.20引入errors.Join之前,每个写校验逻辑的人都踩过的坑。三年过去,大部分代码还在用if err != nil { return err }的老习惯。这个习惯大多数时候是对的,但在三种特定场景下是错的。分辨你在哪种场景,就是这门手艺的全部。


聚合错误长什么样

errors.Join(err1, err2, err3)把多个非空错误包成一个。它的Error()方法会把每个被包的错误单独输出一行。errors.Iserrors.As会遍历整棵树,不只是第一个分支。如果所有参数都是nil,它返回nil——这个特性让聚合模式的代码读起来很干净。

三行校验,一次调用,一个分支。两个失败你会看到两个。全过就继续。

1.20之前怎么干?用github.com/hashicorp/go-multierror

同一个思路,多两行代码,多一个依赖,外加一个开箱不支持errors.Is的自定义类型。multierror在它那个年代是好答案。现在标准库才是。

校验场景只是开胃菜

真正有意思的是扇出RPC。一个请求要调四个下游服务来拼装响应。两个挂了。用户拿到500,提示"服务B不可用",你接下来一小时都在排查B,最后才发现D也挂了,原因还不一样。

errors.Join聚合四个服务的错误,调用方一眼看到全部故障点。调试时间从一小时缩到一分钟。

代码里用sync.WaitGroup并行拉取,sync.Mutex保护错误切片。每个goroutine把错误带标签包一层再塞进去。最后errors.Join(errs...)统一返回。

什么时候不该聚合

错误聚合不是万能药。三种情况要慎用:

第一,调用方只关心"成没成",不关心"怎么没的"。HTTP 404不需要附带文件系统底层错误,用户看不懂,日志里已经记了。

第二,错误有明确的优先级顺序。数据库连接失败比查询语法错误更严重,前者该直接中断,不该混在一起让调用方猜哪个是根因。

第三,错误数量可能爆炸。循环里每个元素都报错,聚合成百上千条,Error()字符串直接撑爆日志缓冲区。这时候该用结构化日志单独记,或者采样。

一个判断标准

问自己:调用方修复一个错误后,是否值得再次尝试?校验场景里,用户改完密码就该重新提交,值得。RPC场景里,运维修好服务B后该自动重试,也值得。

如果答案是"不值得"——比如文件不存在就是不存在,重试也没用——那就用传统的错误链,第一时间把根因抛上去。

Go的错误处理被吐槽多年,但errors.Join其实给了一个精妙的区分:错误是"流程中断信号"还是"待办事项清单"。前者用链式包裹,后者用扁平聚合。混用这两种模式,代码会自己告诉你哪里别扭。

最后说句得罪人的话:还在用go-multierror的新项目,要么维护者没看1.20的release note,要么看了觉得"迁移成本太高"——但这两个函数的行为几乎一致,替换就是改个import的事。不迁,大概率和当年坚持用dep不用go mod的是同一批人。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
嫁进王室7年,苏提达终于戴上王冠了,富贵优雅不输曾经的诗丽吉

嫁进王室7年,苏提达终于戴上王冠了,富贵优雅不输曾经的诗丽吉

小书生吃瓜
2026-05-05 20:15:32
南昌起义中唯一叛变副军长:历经22年回归组织,终成副国级领导人

南昌起义中唯一叛变副军长:历经22年回归组织,终成副国级领导人

鉴史录
2026-04-26 06:02:06
我和一位“官二代”女镇长搭班子,才明白什么叫认知的碾压

我和一位“官二代”女镇长搭班子,才明白什么叫认知的碾压

千秋文化
2026-04-25 20:37:53
如果一个家庭长期没酒局、没社交,也少走亲戚,只能说明这两个问题

如果一个家庭长期没酒局、没社交,也少走亲戚,只能说明这两个问题

心理观察局
2026-05-04 09:23:46
反制高价勒索!不止中国,还有这么多国家拒绝为世界杯买单

反制高价勒索!不止中国,还有这么多国家拒绝为世界杯买单

十点街球体育
2026-05-05 23:10:03
郑裕玲当年狠心驱吕方离豪宅,如今当下状况,正符周润发那句告诫

郑裕玲当年狠心驱吕方离豪宅,如今当下状况,正符周润发那句告诫

梦想的旅途照进现实
2026-05-05 17:41:23
中国女排集训有变!赵勇带队,20人将全部离京,新地点公布

中国女排集训有变!赵勇带队,20人将全部离京,新地点公布

跑者排球视角
2026-05-05 21:38:31
成都东站,袖珍高铁枢纽站客流极限究竟在哪

成都东站,袖珍高铁枢纽站客流极限究竟在哪

匹夫来搞笑
2026-05-05 20:52:59
炸锅!科尔离队尘埃落定?不续约真相曝光,勇士王朝真的要落幕了

炸锅!科尔离队尘埃落定?不续约真相曝光,勇士王朝真的要落幕了

体育大朋说
2026-05-05 13:10:08
女人有钱没钱,一眼就能看出来:没钱的女人,大多有这三个穷习惯

女人有钱没钱,一眼就能看出来:没钱的女人,大多有这三个穷习惯

荷兰豆爱健康
2026-05-04 12:57:32
斯威士兰国王准备的晚宴就这样,他已经回去了,航线很绕躲着走

斯威士兰国王准备的晚宴就这样,他已经回去了,航线很绕躲着走

纵拥千千晚星
2026-05-06 06:36:17
美媒:美以正在协调,或准备对伊朗发动新一轮打击

美媒:美以正在协调,或准备对伊朗发动新一轮打击

界面新闻
2026-05-05 21:01:49
重庆动物园通报“大熊猫食用竹子被指发霉”:供应商处理不当致部分竹子变质

重庆动物园通报“大熊猫食用竹子被指发霉”:供应商处理不当致部分竹子变质

界面新闻
2026-05-06 07:09:51
美国质问中国:若中国真的爱好和平,为何还要大力发展军事?

美国质问中国:若中国真的爱好和平,为何还要大力发展军事?

墨羽怪谈
2026-04-21 18:29:25
终留遗憾,格列兹曼的马竞生涯不会有任何一座欧冠、西甲和国王杯

终留遗憾,格列兹曼的马竞生涯不会有任何一座欧冠、西甲和国王杯

懂球帝
2026-05-06 05:17:05
史上最抢手皇后,6位帝王轮番霸占60年不停歇,48岁还被人争着要

史上最抢手皇后,6位帝王轮番霸占60年不停歇,48岁还被人争着要

小豫讲故事
2026-04-12 06:00:09
苹果官网直接上架新品,配色太好看了!

苹果官网直接上架新品,配色太好看了!

花果科技
2026-05-05 13:14:19
马德里决赛惨败后,兹维列夫社媒取关辛纳、阿尔卡拉斯

马德里决赛惨败后,兹维列夫社媒取关辛纳、阿尔卡拉斯

懂球帝
2026-05-05 21:46:09
劳务派遣在央国企杀疯了!

劳务派遣在央国企杀疯了!

灯锦年
2026-04-21 17:56:52
西十高铁:穿越秦岭的“三小时”新动脉

西十高铁:穿越秦岭的“三小时”新动脉

小鹿姐姐情感说
2026-05-06 07:49:45
2026-05-06 08:40:49
我是一个养虾人
我是一个养虾人
有态度网友ytd
2138文章数 25关注度
往期回顾 全部

科技要闻

告别废话文学与幻觉!GPT-5.5 Instant发布

头条要闻

牛弹琴:高市终于下跪了 中韩等亚洲人内心感到气愤

头条要闻

牛弹琴:高市终于下跪了 中韩等亚洲人内心感到气愤

体育要闻

全世界都等着看他笑话,他带国米拿下冠军

娱乐要闻

内娱真情谊!杨紫为谢娜演唱会送花篮

财经要闻

70亿,保时捷把布加迪卖了

汽车要闻

同比大涨190% 方程豹4月销量29138台

态度原创

亲子
房产
家居
手机
公开课

亲子要闻

这个五一,带宝宝来北海看海啦~银滩细沙海浪,是小朋友最爱的天

房产要闻

五一楼市彻底明牌!塔尖人群都在重仓凯旋新世界

家居要闻

灵动实用 生活艺术场

手机要闻

苹果同意支付2.5亿美元和解有关Siri功能延迟的集体诉讼

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版