Go 1.0 — 2012 年 3 月:

Go 的第一个版本,带着一份兼容性说明文档来保证与未来发布版本的兼容性,进而不会破坏已有的程序。

第一个版本已经有 go tool pprof 命令和 go vet 命令。 go tool pprof 与 Google 的 pprof C++ profiler 稍微有些差异。go vet(前身是 go tool vet)命令可以检查包中潜在的错误。

Go 1.1 — 2013 年 5 月:

这个 Go 版本专注于优化语言(编译器,gc,map,go 调度器)和提升它的性能。下面是一些提升的例子:

这个版本也嵌入了竞争检测,在语言中是一个很强大的工具。

你可以在我的文章 ThreadSanitizer 竞争检测中发现更多的信息。

重写了 Go 调度器 显著地提升了性能。Go 调度器现在被设计成这样:

M 是一个 OS 线程,P 表示一个处理器(P 的数量不能大于 GOMAXPROCS),每个 P 作为一个本地协程队列。在 1.1 之前 P 不存在,协程是用一个全局的 mutex 在全局范围内管理的。随着这些优化,工作窃取也被实现了,允许一个 P 窃取另一个 P 的协程:

阅读 Jaana B.Dogan 的 Go 的工作窃取调度器 可以查看更多关于 Go 调度器和工作窃取的信息。

Go 1.2 — 2013 年 12 月:

本版本中 test 命令支持测试代码覆盖范围并提供了一个新命令 go tool cover ,此命令能测试代码覆盖率:

这个命令也能提供覆盖信息:

Go 1.3 — 2014 年 6 月:

这个版本对栈管理做了重要的改进。栈可以申请连续的内存片段,提高了分配的效率,使下一个版本的栈空间降到 2KB。

栈频繁申请/释放栈片段会导致某些元素变慢,本版本也改进了一些由于上述场景糟糕的分配导致变慢的元素。下面是一个 json 包的例子,展示了它对栈空间的敏感程度:

使用连续的栈修复了这个元素效率低下的问题。下面是另一个例子,html/template 包的性能对栈大小也很敏感:

阅读我的Go 协程栈空间的发展查看更多信息。

这个版本在 sync 包中发布了 Pool。 这个元素允许我们复用结构体,减少了申请的内存的次数,同时也是很多 Go 生态获得改进的根源,如标准库或包里的 encoding/jsonnet/http,还有 Go 社区里的 zap

可以在我的文章 Sync.Pool 设计理解 中查看更多关于 Pool 的信息。

Go 团队也对通道作了改进,让它们变得更快。下面是以 Go 1.2 和 Go 1.3 作对比运行的基准:

Go 1.4 — 2014 年 12 月:

此版本带来了官方对 Android 的支持,golang.org/x/mobile ) 让我们可以只用 Go 代码就能写出简单的 Android 程序。

归功于更高效的 gc,之前用 C 和汇编写的运行时代码被翻译成 Go 后,堆的大小降低了 10% 到 30%。

与版本无关的一个巧合是,Go 项目管理从 Mercurial 移植到了 Git,代码从 Google Code 移到了 Github。

Go 也提供了 go generate 命令通过扫描用 //go:generate 指示的代码来简化代码生成过程。

在 Go 博客 和文章生成代码中可以查看更多信息。

Go 1.5 — 2015 年 8 月:

这个新版本,发布时间推迟了两个月,目的是在以后每年八月和二月发布新版本:

这个版本对 gc 进行了重新设计。归功于并发的回收,在回收期间的等待时间大大减少。下面是一个 Twitter 生产环境的服务器的例子,等待时间由 300ms 降到 30ms:

这个版本也发布了运行时追踪,用命令 go tool trace 可以查看。测试过程或运行时生成的追踪信息可以用浏览器窗口展示:

Go 1.6 — 2016 年 2 月:

这个版本最重大的变化是使用 HTTPS 时默认支持 HTTP/2。

在这个版本中 gc 等待时间也降低了:

Go 1.7 — 2016 年 8 月:

这个版本发布了 context 包,为用户提供了处理超时和任务取消的方法。

阅读我的文章 传递上下文和取消来获取更多关于 context 的信息。

对编译工具链也作了优化,编译速度更快,生成的二进制文件更小,有时甚至可以减小 20% 到 30%。

Go 1.8 — 2017 年 2 月:

把 gc 的停顿时间减少到了 1 毫秒以下:

其他的停顿时间已知,并会在下一个版本中降到 100 微秒以内。

这个版本也改进了 defer 函数:

我的文章 defer 语句工作机制中有更多信息。

Go 1.9 — 2017 年 8 月:

这个版本支持下面的别名声明:

  1. type byte = uint8

这里 byteuint8 的一个别名。

sync 包新增了一个 Map 类型,是并发写安全的。

我的文章 Map 与并发写 中有更多信息。

Go 1.10 — 2018 年 2 月:

test 包引进了一个新的智能 cache,运行会测试后会缓存测试结果。如果运行完一次后没有做任何修改,那么开发者就不需要重复运行测试,节省时间。

  1. first run:
  2. ok /go/src/retro 0.027s
  3. second run:
  4. ok /go/src/retro (cached)

为了加快构建速度,go build 命令现在也维持了一份最近构建包的缓存。

这个版本没有对 gc 做实际的改变,但是确定了一个新的 SLO(Service-Level Objective):

Go 1.11 — 2018 年 8 月:

Go 1.11 带来了一个重要的新功能:Go modules。去年的调查显示,Go modules 是 Go 社区遭遇重大挑战后的产物:

第二个特性是实验性的 WebAssembly,为开发者提供了把 Go 程序编译成一个可兼容四大主流 Web 浏览器的二进制格式的能力。

Go 1.12 — 2019 年 2 月:

基于 analysis 包重写了 go vet 命令,为开发者写自己的检查器提供了更大的灵活性。

我的文章构建自己的分析器中有更多信息。

Go 1.13 — 2019 年 9 月:

改进了 sync 包中的 Pool,在 gc 运行时不会清除 pool。它引进了一个缓存来清理两次 gc 运行时都没有被引用的 pool 中的实例。

重写了逃逸分析,减少了 Go 程序中堆上的内存申请的空间。goprivate私有仓库

Go1.14 - 2020 年 2 月:

现在 Go Module 已经可以用于生产环境,鼓励所有用户迁移到 Module。该版本支持嵌入具有重叠方法集的接口。性能方面做了较大的改进,包括:进一步提升 defer 性能、页分配器更高效,同时 timer 也更高效。

现在,Goroutine 支持异步抢占。

Go1.15 - 2020 年 8 月:

主要是连接器的优化,加入tzdata

Go1.16 - 2021年2月16日

​嵌入文件系统:新增 embed 包,支持将静态文件直接嵌入Go程序。
io/fs 接口:引入抽象文件系统接口,便于操作虚拟文件系统。
​模块改进:增强 go.mod 的依赖管理,支持工作区模式。
​构建模式:新增 -buildmode=embed 选项,简化资源嵌入流程。

Go1.17 - 2021年8月2日

​本地多模块工作区:通过 go.work 文件支持本地多个模块的联合开发。
​泛型原型设计:初步实验性支持泛型语法(正式版在1.18)。
​性能优化:编译速度提升,垃圾回收效率改进。
​标准库增强:新增 time 包的 Format 函数对ISO 8601时区的支持。

Go1.18 - 2022年3月15日

泛型正式支持:引入类型参数和约束(~T),支持编写通用代码。
​类型集合:允许使用 comparable 等预定义约束。
​性能优化:垃圾回收延迟降低,编译速度进一步提升。
​标准库更新:新增 context 包的 WithTimeoutContext 方法。

Go1.19 - 2022年8月29日

​泛型增强:支持泛型函数返回具体类型,优化类型推断。
​错误处理改进:新增 errors.Unwrap 函数,简化错误链解析。
​上下文超时控制:context 包新增 TimeoutContext 方法。
​性能优化:编译速度提升,运行时内存占用降低。

Go1.20 - 2023年2月1日

泛型默认类型:允许为泛型参数设置默认类型(如 T = int)。
​嵌入目录支持:embed 包新增 //go:embed dir/* 支持目录嵌入。
​错误处理增强:errors.Is 和 errors.As 支持更多场景。
​标准库更新:net/http 新增 TimeoutHandler 配置优化。

Go1.21 - 2023年8月28日

​内置函数:新增 min、max 和 clear 函数,简化常见操作(如清空切片/映射)。
​PGO 优化:通过性能分析(Profile-Guided Optimization)提升编译效率,部分场景性能提升 2%-7%。
​WebAssembly 增强:支持 WASI 标准,新增 wasmimport 指令简化 WebAssembly 代码编写。
​垃圾回收优化:降低尾延迟最高 40%,提升高并发场景性能。

Go1.22 - 2024 年 2 月

循环变量作用域改进:每次迭代生成独立变量副本,避免并发竞态问题。
for-range 支持整数类型:可直接迭代整数范围(如 for i := range 10)。
​标准库增强:
math/rand/v2 包提供更高质量的伪随机数生成。
net/http.ServeMux 支持更复杂的路由匹配(如按 HTTP 方法过滤)。
​性能优化:编译器堆栈帧槽重叠技术减少内存占用。

Go1.23 - 2024 年 8 月

迭代器支持:for-range 循环可接受迭代器函数(如 func(func(K) bool)),新增 iter 包简化迭代逻辑。
​工具链遥测:默认收集本地使用数据(可匿名上传),帮助优化工具链设计。
​运行时改进:
崩溃时的堆栈回溯缩进区分不同 Goroutine。
链接器禁止引用未标记的标准库内部符号,增强安全性。
​标准库更新:
time.Timer 和 time.Ticker 通道改为无缓冲,避免旧数据残留。
新增 unique 包用于规范化值处理。

Go1.24 - 2025 年 2 月

泛型类型别名:允许为泛型类型定义别名(如 type VectorAlias[T any] = Vector[T]),提升代码可读性。
​cgo 优化:新增 -cgo noescape 标志避免内存逃逸,提升 C 代码调用效率。
​WebAssembly 增强:支持 SIMD 指令和更小的二进制体积,优化执行性能。
​操作系统支持:放弃对 Linux 2.6.32 内核的支持,最低要求提升至 3.2。

Go1.25 - (计划 2025 年 8 月发布)​

预计更新内容(基于社区分析)​:

​移除核心类型(Core Types)​:简化泛型语义,消除类型约束的复杂性(如不再强制要求联合类型统一底层类型)。
​工具链增强:
构建系统默认启用 ASAN 内存泄漏检测(-asan 标志)。
新增 work 包模式管理多模块项目。
​运行时改进:
异常日志格式优化(如重复 panic 信息更清晰)。
Linux 匿名内存映射支持 VMA 标注(如堆内存标记为 [anon: Go: heap])。
​标准库更新:
crypto/tls 增强 FIPS 140-3 合规性,支持 Ed25519 算法。
io/fs 包新增符号链接支持接口。