渐进式编程课
Go 目录
第 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 可用,未见废弃标记)。

官方参考