go+Go Atlas版本特性图谱
官方文档 ↗
历史正式系列 · 学习与迁移参考go1.20.14

Go 1.20

给失败和取消保留上下文

错误可以组合,Context 可以携带取消原因,字符串前后缀处理更直接。

查看发布说明 ↗
LEARN BY DOING

学习路线与升级检查

已有 Go 基础可从示例开始;首次学习建议先完成 Go Tour ↗ 中的函数、切片、接口与并发部分。历史版本用于理解演进,新项目选用受支持的正式版本。

这一版怎么学

  • 01 · errors.Join 组合错误

    批处理结束后报告多项独立失败。

  • 02 · Context 取消原因

    区分主动关闭、下游失败等不同取消来源。

  • 03 · CutPrefix 与 CutSuffix

    处理命令前缀、资源名称或简单文本协议。

升级前检查

  • errors.Join 的结果要用 errors.Is / As 检查,不按错误文本做业务判断。
  • 确认取消原因如何传递,资源清理仍需执行 cancel。
  • 检查已经弃用的历史依赖与平台支持,阅读官方兼容性说明。

官方发布说明 ↗ · 核对于 2026-10-06

THE HIGHLIGHTS

这一版,值得关注 03

01标准库

errors.Join 组合错误

多个错误可组合成一个错误树,errors.Is 和 As 会遍历其中的分支。

怎么用批处理结束后报告多项独立失败。

旧版做法只返回第一个错误,或自建错误列表类型。

注意事项Join 忽略 nil;不能假设 errors.Unwrap 可以返回所有子错误。

官方依据 ↗ · 最低版本 1.20 · 核对于 2026-10-06

运行示例保存为 main.go,在 go.mod 声明 go 1.20 或以上的项目中执行 go run .

Go 1.20 · main.go
package main
import ("errors"; "fmt")
func main() {
    disk := errors.New("disk"); network := errors.New("network")
    combined := errors.Join(disk, network)
    fmt.Println(errors.Is(combined, disk), errors.Is(combined, network))
}
运行结果
true true
02并发

Context 取消原因

WithCancelCause 创建的 Context 可通过 Cause 读取具体取消原因。

怎么用区分主动关闭、下游失败等不同取消来源。

旧版做法只能读取 context.Canceled,另行保存原因。

注意事项ctx.Err() 仍报告标准取消状态;具体业务原因通过 context.Cause 获取。

官方依据 ↗ · 最低版本 1.20 · 核对于 2026-10-06

运行示例保存为 main.go,在 go.mod 声明 go 1.20 或以上的项目中执行 go run .

Go 1.20 · main.go
package main
import ("context"; "errors"; "fmt")
func main() {
    ctx, cancel := context.WithCancelCause(context.Background())
    cancel(errors.New("maintenance"))
    fmt.Println(context.Cause(ctx))
}
运行结果
maintenance
03标准库

CutPrefix 与 CutSuffix

移除指定前后缀的同时返回是否匹配,避免再次判断。

怎么用处理命令前缀、资源名称或简单文本协议。

旧版做法先 HasPrefix 再 TrimPrefix,重复表达同一条件。

注意事项按字面值匹配,不是正则表达式,也不会忽略大小写。

官方依据 ↗ · 最低版本 1.20 · 核对于 2026-10-06

运行示例保存为 main.go,在 go.mod 声明 go 1.20 或以上的项目中执行 go run .

Go 1.20 · main.go
package main
import ("fmt"; "strings")
func main() { value, found := strings.CutPrefix("user:Ada", "user:"); fmt.Println(value, found) }
运行结果
Ada true

FROM THE SOURCE

官方完整变更目录 69

What’s New ↗

自动同步官方目录,涵盖语言、标准库、弃用及迁移变化。标题保留官方原文;中文解读精选于上方。

展开 Go 1.20 的全部变更 +
YOUR TURN

动手练习

组合一个业务错误与 nil,确认 errors.Is 仍能找到业务错误。

提示:errors.Join 会忽略 nil 参数。

展开参考答案
Go 1.20 · main.go
package main
import ("errors"; "fmt")
func main() { failed := errors.New("failed"); fmt.Println(errors.Is(errors.Join(nil, failed), failed)) }
运行结果
true