渐进式编程课
Go 目录
第 20 课2026.09.28

分别提示“非正数”和“超过上限”的练习时长。

第 20 课:区分两类时长校验错误

  • 日期:2026-09-28
  • 课程序号:第 20 课
  • 知识点:为第二类失败定义独立错误身份

用途或适用场景

分别提示“非正数”和“超过上限”的练习时长。

核心概念

为上限错误添加独立 sentinel,并继续用 %w 包装、errors.Is 分支;不解析错误字符串。需要 Go 1.13 或更新版本。

最小代码或操作示例

go
package main
import (
    "errors"
    "fmt"
)
var errMinutes = errors.New("minutes must be positive")
var errTooLong = errors.New("minutes must be at most 60")
func validate(minutes int) error {
    if minutes <= 0 { return fmt.Errorf("minutes=%d: %w", minutes, errMinutes) }
    if minutes > 60 { return fmt.Errorf("minutes=%d: %w", minutes, errTooLong) }
    return nil
}
func main() {
    err := validate(90)
    if errors.Is(err, errMinutes) { fmt.Println("请输入正数分钟") }
    if errors.Is(err, errTooLong) { fmt.Println("最多 60 分钟") }
}

3~5 分钟练习

分别用 -3、5 调用 validate,观察提示。

参考答案

-3 只输出“请输入正数分钟”;5 不输出任何错误提示。

与上一课的联系

沿用第 19 课的 errMinutes、validate、%w 与 errors.Is;本课只新增第二种错误身份和对应分支;下一课可把两种错误提示封装成一个显示函数。

时效校验

时效校验:2026-09-28(已打开 Go 当前标准库 errors.Is 与 fmt.Errorf 文档;包装与身份匹配自 Go 1.13 可用,未见废弃标记)。

官方参考