Go 1.13 错误处理新工具核心是支持错误链的查询、转换与组合:errors.Is 判断链中是否存在目标错误,errors.As 提取指定类型错误,errors.Join 合并多错误,%w 是唯一推荐的包装方式。
Go 1.13 引入的错误处理新工具,核心是让错误链(error chain)可查、可转、可组合。它们不是替代 == 或 errors.New,而是解决“被包装过的错误怎么判断类型/提取原因”这个长期痛点。
用于检查一个错误是否等于(或其底层包装链中包含)某个已知错误值(常量或变量),支持多层包装。
Unwrap() 逐层展开,直到匹配到目标错误,或返回 nil
errors.New、fmt.Errorf 带 %w 包装的错误,或实现了 Is(error) bool 方法的自定义错误*os.PathError,该用 errors.As)示例:
```go用于向下转型(type assertion),把错误链里第一个匹配指定类型的错误赋值给目标变量,适合获取底层具体错误信息(如路径、errno 等)。
Unwrap(),找到第一个满足 target 类型的错误并赋值target 必须是指针(如 *os.PathError),否则 panicbool 表示是否成功提取示例:
```go将零个或多个错误打包成一个 interface{ Unwrap() []error } 类型的错误,便于统一返回(尤其在并发或批量操作中)。
Unwrap() 会返回所有子错误切片(顺序与传入一致)Error() 方法,但标准库的 fmt 包对其实现了友好格式化(如 fmt.Errorf("failed: %w", errors.Join(e1,e2)))errors.Is 或 errors.As 在 Join 结果上查单个子错误——需先 Unwrap() 再逐个查,或用循环配合 errors.Is/As
示例:
```go
在 fmt.Errorf 中使用 %w 动词,表示“将后面的 error 值包装进新错误”,这是构建可追溯错误链的唯一推荐方式。
%w 包装的错误可通过 errors.Unwrap()、errors.Is、errors.As 向下访问fmt.Errorf 中最多一个 %w),且必须是最后一个参数%w 而用 %s 或字符串拼接,会导致错误链断裂,无法用 Is/As 追溯示例:
```go