Skip to main content

Go: 标准库 errors

📅 2026-03-13 ✏️ 2026-03-14 Go 标准库 CS GO

1 · 标准库 errors#

错误是值:可以创建、传递、检验、比较判断(基于错误的控制流)

errors 包提供了一些简单的原语:创建错误、展开错误、判断错误

// 创建错误值
func New(text string) error {}

// 判断错误:控制流
func Is(err, target error) bool           {}
func As(err error, target any) bool       {}
func AsType[E error](err error) (E, bool) {}

// err 实现`Unwrap() error`则调用,否则返回nil
func Unwrap(err error) error {}

x/xerrors#

xerrors 是 Go 1.13 error values 提案的过渡包。IsAsUnwrapfmt.Errorf%w 已合入标准库。

特性errors (std)x/xerrors
Is / As / Unwrap✅ (1.13+)
fmt.Errorf %w✅ (1.13+)
自动捕获调用栈 (Frame)
Formatter / Printer 协议
Opaque 切断错误链
导出 Wrapper 接口

以下是未合入标准库的部分

  • 调用栈捕获(Stack Trace):标准库的 errors.New / fmt.Errorf 不捕获调用栈,xerrors 会自动记录。

  • 格式化协议(Formatter / Printer):标准库无此机制,xerrors 提供结构化的错误链格式化,使用 %+v 打印时会输出完整错误链 + 每层的调用位置。

  • Opaque(err error) error:返回一个与 err 格式相同但不可 Unwrap、不可 Is/As 匹配的错误——用于切断错误链,隐藏内部实现细节。

  • Wrapper 接口:标准库在 Go 1.13 中以隐式协议(duck typing)方式使用 Unwrap(),但没有导出 Wrapper 接口类型。xerrors 显式导出了它。