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

Go 1.22

循环和 HTTP 路由更好理解

新的循环变量语义减少闭包误用,整数 range 简化计数,ServeMux 支持方法与路径参数。

查看发布说明 ↗
LEARN BY DOING

学习路线与升级检查

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

这一版怎么学

  • 01 · 每轮独立的循环变量

    保存回调、创建任务时减少意外共享。

  • 02 · range 整数

    重试次数、固定数量的工作单元和简单计数。

  • 03 · ServeMux 方法与路径参数

    使用标准库实现清晰的小型 HTTP API。

升级前检查

  • 循环变量语义由模块语言版本等条件控制,升级工具链后也要核对 go.mod。
  • 检查依赖旧 ServeMux 匹配规则的路径,避免路由冲突。
  • 闭包和并发测试仍需验证,不把每轮变量独立等同于所有共享数据都安全。

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

THE HIGHLIGHTS

这一版,值得关注 03

01语法

每轮独立的循环变量

for 中声明的循环变量在每轮迭代中独立,闭包不再全部捕获最后一轮的变量。

怎么用保存回调、创建任务时减少意外共享。

旧版做法在循环体里用 v := v 重新声明,再创建闭包。

注意事项使用赋值给既有变量的循环仍会共享变量;示例模块需声明 go 1.22 或以上。

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

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

Go 1.22 · main.go
package main
import "fmt"
func main() {
    var callbacks []func() int
    for i := 0; i < 3; i++ { callbacks = append(callbacks, func() int { return i }) }
    for _, callback := range callbacks { fmt.Print(callback(), " ") }; fmt.Println()
}
运行结果
0 1 2
02语法

range 整数

range n 按顺序生成从 0 到 n-1 的整数,让固定次数循环更短。

怎么用重试次数、固定数量的工作单元和简单计数。

旧版做法写 for i := 0; i < n; i++。

注意事项n 小于或等于零时不执行循环;不是从 1 开始计数。

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

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

Go 1.22 · main.go
package main
import "fmt"
func main() { total := 0; for i := range 4 { total += i }; fmt.Println(total) }
运行结果
6
03标准库

ServeMux 方法与路径参数

HTTP 路由可声明 GET /users/{name},通过 Request.PathValue 读取路径参数。

怎么用使用标准库实现清晰的小型 HTTP API。

旧版做法手动判断方法并切分 URL,或使用第三方路由器。

注意事项路由冲突可能在注册时 panic;GET 模式也匹配 HEAD。

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

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

Go 1.22 · main.go
package main
import ("fmt"; "net/http"; "net/http/httptest")
func main() {
    mux := http.NewServeMux()
    mux.HandleFunc("GET /users/{name}", func(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, r.PathValue("name")) })
    recorder := httptest.NewRecorder()
    mux.ServeHTTP(recorder, httptest.NewRequest("GET", "/users/Ada", nil))
    fmt.Println(recorder.Body.String())
}
运行结果
Ada

FROM THE SOURCE

官方完整变更目录 24

What’s New ↗

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

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

动手练习

使用 range 5 计算 0 到 4 的平方和。

提示:每轮把 i*i 加入 total。

展开参考答案
Go 1.22 · main.go
package main
import "fmt"
func main() { total := 0; for i := range 5 { total += i*i }; fmt.Println(total) }
运行结果
30