
大家好,我是Tony Bai。
自 Go 1.13 引入errors.Is 和errors.As以来,Go 语言的错误处理进入了一个结构化、可追溯的新时代。然而,errors.As 的使用方式,对于追求代码简洁与优雅的 Gopher 而言,始终存在一丝“不和谐”:开发者必须预先声明一个目标错误类型的变量,然后将其指针传入函数。
随着 Go 1.18 泛型的正式落地,一个酝酿已久的问题浮出水面:我们能否利用类型参数,彻底重塑这一核心错误检查机制,终结那些恼人的样板代码?GitHub 上的 Issue #51945 正是这场变革的中心舞台。它不仅是一个新函数AsA的提案,更深刻地揭示了 Go 社区是如何在 API 设计、性能、向后兼容性与语言哲学之间反复权衡,以决定 errors.As 的未来。那么,AsA 会是 errors.As 的下一站吗?在这篇文章中,我就和大家一起来看一下Go社区和Go团队针对这一提案的讨论和决策过程。
现状之痛:errors.As 的人体工程学难题
要理解为何需要“重塑”,我们必须先审视 errors.As 带来的便利与痛点,我们先来看一下现状:
// Go 1.13 至今的标准模式
err := someOperation()
if err != nil {
var myErr *MyCustomError
if errors.As(err, &myErr) {
// myErr 在这里可用,但它的声明却在 if 语句之外
// ...处理 myErr...
}
var otherErr *OtherError
if errors.As(err, &otherErr) {
// ...处理 otherErr...
}
// ...
}
这种模式存在几个显而易见的痛点:
样板代码:<

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



