第 18 课2026.09.23
给校验失败增加课程时长上下文,同时让调用方仍能识别原始错误。
第 18 课:使用 %w 包装底层错误
- 日期:2026-09-23
- 课程序号:第 18 课
- 知识点:
fmt.Errorf的%w
用途或适用场景
给校验失败增加课程时长上下文,同时让调用方仍能识别原始错误。
核心概念
%w 在错误文本中加入底层错误并保留可展开的错误链;调用方用 errors.Is 匹配原错误。
最小代码或操作示例
go
package main
import (
"errors"
"fmt"
)
var errMinutes = errors.New("minutes must be positive")
func validate(minutes int) error {
if minutes <= 0 { return fmt.Errorf("minutes=%d: %w", minutes, errMinutes) }
return nil
}
func main() {
fmt.Println(errors.Is(validate(-3), errMinutes)) // true
}3~5 分钟练习
把 -3 改成 5,再次调用 errors.Is。
参考答案
validate(5) 返回 nil,因此 errors.Is(nil, errMinutes) 为 false。
与上一课的联系
沿用第 17 课的 validate(minutes) 与 errMinutes,以及第 16 课的 fmt.Errorf 上下文;本课只新增 %w,让上下文与底层错误身份同时保留;完成后下一课可在调用处按错误身份决定提示文字。
时效校验
时效校验:2026-09-24(Go 标准库 fmt 与 errors 文档;%w 和 errors.Is 自 Go 1.13 可用,未见废弃标记)。