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

Go 1.25

并发编排与测试更方便

WaitGroup.Go 减少任务计数样板,synctest 支持隔离的并发测试,运行时更理解容器 CPU 预算。

查看发布说明 ↗
LEARN BY DOING

学习路线与升级检查

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

这一版怎么学

  • 01 · WaitGroup.Go

    等待一组独立任务结束。

  • 02 · testing.synctest

    测试定时器和并发状态,减少真实等待与时序偶然性。

  • 03 · 容器感知 GOMAXPROCS

    让容器里的调度并行度更接近可用 CPU 预算。

升级前检查

  • 检查在 goroutine 内部调用 WaitGroup.Add 的旧代码,避免计数与 Wait 竞争。
  • 测试并发逻辑时区分实际时间与 synctest 环境中的虚拟时间。
  • 升级后核对容器 GOMAXPROCS 与延迟表现,手动设置会覆盖自动行为。

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

THE HIGHLIGHTS

这一版,值得关注 03

01并发

WaitGroup.Go

WaitGroup.Go 同时启动 goroutine 并管理完成计数,减少 Add / Done 的重复配对。

怎么用等待一组独立任务结束。

旧版做法先 Add,再启动 goroutine 并 defer Done。

注意事项传入的函数不得 panic;对错误处理和取消仍需另行设计。

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

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

Go 1.25 · main.go
package main
import ("fmt"; "sync")
func main() {
    var group sync.WaitGroup
    results := make(chan int, 1)
    group.Go(func() { results <- 42 })
    group.Wait(); fmt.Println(<-results)
}
运行结果
42
02开发体验

testing.synctest

synctest 在隔离环境中运行并发测试,使用虚拟时间和 Wait 等待任务阻塞或完成。

怎么用测试定时器和并发状态,减少真实等待与时序偶然性。

旧版做法sleep 固定时间后检查状态,容易出现慢测和偶发失败。

注意事项1.24 曾提供实验 API;这里展示的是 1.25 的稳定 Test / Wait 接口。

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

运行示例保存为 lesson_test.go,在 go.mod 声明 go 1.25 或以上的项目中执行 go test -v .

Go 1.25 · lesson_test.go
package example
import ("testing"; "testing/synctest"; "time")
func TestTimer(t *testing.T) {
    synctest.Test(t, func(t *testing.T) {
        ready := false
        go func() { time.Sleep(time.Second); ready = true }()
        time.Sleep(2*time.Second)
        synctest.Wait()
        if !ready { t.Fatal("timer did not fire") }
    })
}
03性能

容器感知 GOMAXPROCS

默认 GOMAXPROCS 会参考 Linux cgroup CPU 带宽限制,并可随资源变化更新。

怎么用让容器里的调度并行度更接近可用 CPU 预算。

旧版做法根据容器配置手动设置 GOMAXPROCS,或引入辅助库。

注意事项CPU limit 与 request 不相同;环境变量或显式调用会关闭默认自动行为,效果应在目标容器测量。

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

FROM THE SOURCE

官方完整变更目录 59

What’s New ↗

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

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

动手练习

使用 WaitGroup.Go 启动两个任务,把结果送入容量为 2 的通道,输出总和。

提示:先等待再接收时,通道容量必须足以容纳所有发送结果。

展开参考答案
Go 1.25 · main.go
package main
import ("fmt"; "sync")
func main() {
    var group sync.WaitGroup; results := make(chan int, 2)
    group.Go(func() { results <- 2 }); group.Go(func() { results <- 3 })
    group.Wait(); fmt.Println(<-results + <-results)
}
运行结果
5