Go 版本演进:从 1.0 到 1.26.5 的重大变化与特性
本文档梳理了 Go 语言从 2012 年 1.0 发布到 2026 年 1.26.5 的主要语言特性、标准库更新、工具链改进和性能提升,每个特性附简单代码示例。
参考来源:
Go 1.0(2012-03-28)
Go 的第一个稳定版本。核心特性:
- Go 1 兼容性承诺:后续版本保持向后兼容
- 标准库:
net/http、encoding/json、template、crypto/tls等 - 工具链:
go get、go fmt、go test、go doc - 并发模型:goroutine 和 channel
package main
import "fmt"
func main() {
// goroutine 与 channel
ch := make(chan string)
go func() {
ch <- "Hello, Go 1.0!"
}()
fmt.Println(<-ch)
}
Go 1.1(2013-05-13)
竞态检测器(Race Detector)
运行时检测数据竞争,在测试或运行程序时通过 -race 标志启用。
// go run -race main.go
package main
import "fmt"
func main() {
m := make(map[string]int)
// 竞态检测器可以发现这种并发写入
go func() {
m["a"] = 1
}()
m["a"] = 2
fmt.Println(m["a"])
}
方法值(Method Values)
方法可以作为值使用。
type Point struct{ X, Y int }
func (p Point) Distance() float64 {
return float64(p.X*p.X + p.Y*p.Y)
}
func main() {
p := Point{3, 4}
f := p.Distance // 方法值
println(f())
}
Go 1.2(2013-12-01)
完整切片表达式(Full Slice Expression)
可以同时指定切片的长度和容量。
func main() {
s := []int{0, 1, 2, 3, 4, 5}
// 三索引切片: s[low:high:max]
// 容量 = max - low
t := s[1:3:4] // len=2, cap=3
println(len(t), cap(t)) // 2 3
}
encoding 包
提供标准编解码接口。
import "encoding"
// TextMarshaler 和 TextUnmarshaler 接口
var _ encoding.TextMarshaler = (*myType)(nil)
var _ encoding.TextUnmarshaler = (*myType)(nil)
Go 1.3(2014-06-18)
更精确的垃圾回收器
改进的 GC 算法,减少停顿时间。
连续 Goroutine 栈
goroutine 栈使用连续内存,不再使用分段栈(segmented stacks),提升性能。
// 运行时改进,无需代码更改
func main() {
// 大量 goroutine 现在使用更高效的栈管理
for i := 0; i < 10000; i++ {
go func(i int) {
_ = i
}(i)
}
}
Go 1.4(2014-12-10)
go generate 命令
在源代码中嵌入生成指令,自动运行代码生成工具。
//go:generate stringer -type=Pill
package painkiller
type Pill int
const (
Placebo Pill = iota
Aspirin
Ibuprofen
)
For-Range 无变量
func main() {
// 省略赋值变量
for range []int{1, 2, 3} {
println("hello")
}
}
Go 1.5(2015-08-19)
编译器与运行时自举(Self-hosting)
Go 编译器和运行时用 Go 重写(此前用 C)。
并发垃圾回收器
三色标记清除算法,STW(Stop The World)时间通常 < 10ms。
GOMAXPROCS 默认值
现在默认为 CPU 核心数(此前默认为 1)。
import "runtime"
func main() {
// 默认等于 CPU 核心数
println(runtime.GOMAXPROCS(0))
}
内部包(Internal Packages)
internal 包只能被其父目录中的包导入。
src/
a/
internal/
b.go // 只能被 a/ 及其子包导入
main.go // 可以导入 a/internal
Go 1.6(2016-02-17)
HTTP/2 支持
import "net/http"
func main() {
// HTTP/2 默认启用(当服务端支持时)
resp, err := http.Get("https://example.com")
if err != nil {
panic(err)
}
defer resp.Body.Close()
// 连接自动使用 HTTP/2
}
Vendor 目录
官方支持依赖 vendoring。
myproject/
vendor/
github.com/
foo/
bar/
main.go
Go 1.7(2016-08-15)
context 包
标准库新增 context 包,用于传递取消信号、超时和请求范围的值。
import (
"context"
"time"
)
func main() {
// 带超时的 context
ctx, cancel := context.WithTimeout(
context.Background(),
2*time.Second,
)
defer cancel()
// 传递 context
result := make(chan string)
go func() {
// 模拟耗时操作
time.Sleep(1 * time.Second)
result <- "done"
}()
select {
case <-ctx.Done():
println("超时:", ctx.Err())
case res := <-result:
println(res)
}
}
SSA 编译器后端
基于 SSA(Static Single Assignment)的编译器后端,CPU 性能提升 5-35%,二进制体积缩小 20-30%。
子测试和子基准测试(Sub-tests & Sub-benchmarks)
import "testing"
func TestMath(t *testing.T) {
tests := []struct {
a, b, want int
}{
{1, 2, 3},
{3, 4, 7},
{0, 0, 0},
}
for _, tt := range tests {
t.Run("加法", func(t *testing.T) {
got := tt.a + tt.b
if got != tt.want {
t.Errorf("got %d, want %d", got, tt.want)
}
})
}
}
Go 1.8(2017-02-16)
GC 停顿时间 < 100µs
引入混合写屏障(mixed write barrier),GC 停顿通常低于 100 微秒。
sort.Slice
import "sort"
func main() {
s := []int{3, 1, 4, 1, 5}
sort.Slice(s, func(i, j int) bool {
return s[i] < s[j]
})
// s 变为 [1, 1, 3, 4, 5]
}
HTTP/2 Server Push 与优雅关闭
import (
"context"
"net/http"
"os/signal"
"syscall"
)
func main() {
srv := &http.Server{Addr: ":8080"}
// 优雅关闭
ctx, stop := signal.NotifyContext(
context.Background(),
syscall.SIGINT, syscall.SIGTERM,
)
defer stop()
go srv.ListenAndServe()
<-ctx.Done()
srv.Shutdown(context.Background())
}
Defer 开销减半
编译器优化使 defer 的性能开销显著降低。
Go 1.9(2017-08-24)
类型别名(Type Aliases)
主要用于大型代码库重构。
package main
// 类型别名:MyInt 和 int 是完全相同的类型
type MyInt = int
func main() {
var x int = 42
var y MyInt = x // 不需要转换
println(y)
}
并行编译
包可以并行编译,加速构建。
math/bits 包
提供位计数等底层位操作。
import "math/bits"
func main() {
// 统计二进制中 1 的个数
println(bits.OnesCount8(0x0f)) // 4
// 前导零计数
println(bits.LeadingZeros16(0x00ff)) // 8
// 旋转
println(bits.RotateLeft8(0b10000001, 1)) // 0b00000011
}
单调时钟
time 包使用单调时钟计算时间差,不受系统时间调整影响。
import (
"time"
)
func main() {
start := time.Now()
// ... 耗时操作
elapsed := time.Since(start) // 使用单调时钟
_ = elapsed
}
Go 1.10(2018-02-16)
构建缓存(Build Cache)
go build 自动缓存,加速重复构建。
# 构建缓存默认启用
go build
go test -cache # 查看缓存信息
测试结果缓存
未变更代码的测试结果自动缓存。
go test ./... # 首次运行
go test ./... # 第二次运行(缓存命中)
go test -count=1 ./... # 跳过缓存
Go 1.11(2018-08-24)
Go Modules(实验性)
引入模块系统,支持版本化依赖管理。
// go.mod
module example.com/myproject
go 1.11
require (
golang.org/x/text v0.3.0
)
WebAssembly(WASM)支持
// main.go
package main
import "fmt"
func main() {
fmt.Println("Hello, WebAssembly!")
}
GOOS=js GOARCH=wasm go build -o main.wasm main.go
Go 1.12(2019-02-25)
模块改进
模块支持持续提升,go.mod 成为事实标准。
Map 按 key 排序打印
func main() {
m := map[string]int{"b": 2, "a": 1, "c": 3}
// Go 1.12 起,fmt.Println 按 key 排序输出 map
println(m) // 已排序
}
Go 1.13(2019-09-03)
错误包装(Error Wrapping)
使用 %w 格式化动词创建包装错误,通过 errors.Is 和 errors.As 解包。
import (
"errors"
"fmt"
)
var ErrNotFound = errors.New("not found")
func find(id int) error {
return fmt.Errorf("查找 id=%d: %w", id, ErrNotFound)
}
func main() {
err := find(42)
if errors.Is(err, ErrNotFound) {
println("匹配到 ErrNotFound")
}
// 解包
unwrapped := errors.Unwrap(err)
println(unwrapped.Error()) // "not found"
}
改进的数字字面量语法
func main() {
// 二进制字面量
b := 0b1011 // 11
// 数字分隔符(提升可读性)
n := 1_000_000 // 一百万
// 十六进制浮点数
f := 0x1p-2 // 0.25
_, _, _ = b, n, f
}
Defer 性能提升约 30%
Go 1.14(2020-02-25)
Go Modules 生产就绪
模块模式成为推荐依赖管理方式。
RISC-V 支持
近乎零开销的 Defer
defer 开销接近于零。
func sum(nums []int) int {
// Go 1.14 中,defer 的性能开销极低
defer func() {
recover()
}()
// ... 业务逻辑
return 0
}
异步 Goroutine 抢占
解决无限循环等场景的调度问题。
import (
"runtime"
"time"
)
func main() {
// Go 1.14 之前,这个 goroutine 不会让出 CPU
go func() {
for {
// 异步抢占确保调度器可以中断此循环
}
}()
time.Sleep(time.Second)
println("现在可以到达这里了")
}
Timer 重新实现
time.Timer 和 time.Ticker 性能显著提升,不再使用全局堆。
Go 1.15(2020-08-11)
二进制体积缩小 ~5%
改进的链接器减少二进制文件大小。
链接器加速 20%
# 链接器改进——无缝体验
go build . # 自动受益
Go 1.16(2021-02-16)
模块模式默认启用
GO111MODULE=on 成为默认值。
go:embed 嵌入文件
将静态文件直接嵌入二进制文件。
import (
_ "embed"
"net/http"
)
//go:embed static/index.html
var indexHTML string
//go:embed static/*.css
var cssFiles embed.FS
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte(indexHTML))
})
// 使用 embed.FS 提供静态文件
http.Handle("/static/", http.FileServer(http.FS(cssFiles)))
}
io/ioutil 废弃
推荐直接使用 io 和 os 包。
import (
"io"
"os"
)
func main() {
// 替代 ioutil.ReadAll
data, _ := io.ReadAll(os.Stdin)
_ = data
// 替代 ioutil.ReadDir
entries, _ := os.ReadDir(".")
_ = entries
}
Go 1.17(2021-08-16)
切片转数组指针转换
func main() {
s := []int{1, 2, 3, 4, 5}
// 切片转数组指针(如果切片太短会 panic)
p := (*[3]int)(s)
println(p[0], p[1], p[2]) // 1 2 3
// 安全版本:先检查长度
if len(s) >= 4 {
p4 := (*[4]int)(s)
_ = p4
}
}
//go:build 指令
改进的构建约束语法。
//go:build linux && amd64
package mypackage
// 仅在 linux/amd64 下编译
Go 1.18(2022-03-15)
⭐ 泛型(Generics / Type Parameters)
Go 历史上最重要的语言特性变化。
package main
import "fmt"
// 泛型函数:任何可比较类型的切片包含检查
func Contains[T comparable](elems []T, v T) bool {
for _, e := range elems {
if e == v {
return true
}
}
return false
}
// 泛型类型
type Stack[T any] struct {
items []T
}
func (s *Stack[T]) Push(v T) {
s.items = append(s.items, v)
}
func (s *Stack[T]) Pop() (T, bool) {
if len(s.items) == 0 {
var zero T
return zero, false
}
v := s.items[len(s.items)-1]
s.items = s.items[:len(s.items)-1]
return v, true
}
// 泛型接口约束
type Number interface {
~int | ~float64
}
func Sum[T Number](nums []T) T {
var total T
for _, n := range nums {
total += n
}
return total
}
func main() {
fmt.Println(Contains([]string{"a", "b", "c"}, "b")) // true
fmt.Println(Contains([]int{1, 2, 3}, 5)) // false
s := Stack[string]{}
s.Push("hello")
s.Push("world")
fmt.Println(s.Pop()) // world true
fmt.Println(Sum([]int{1, 2, 3})) // 6
fmt.Println(Sum([]float64{1.5, 2.5})) // 4.0
}
Fuzzing(模糊测试)
import (
"testing"
"unicode/utf8"
)
func FuzzReverse(f *testing.F) {
testcases := []string{"Hello, world", " ", "!12345"}
for _, tc := range testcases {
f.Add(tc) // 种子语料库
}
f.Fuzz(func(t *testing.T, orig string) {
rev := ReverseString(orig)
doubleRev := ReverseString(rev)
if orig != doubleRev {
t.Errorf("反转两次不相等: %q -> %q -> %q", orig, rev, doubleRev)
}
if !utf8.ValidString(orig) {
t.Errorf("产生无效 UTF-8: %q", orig)
}
})
}
func ReverseString(s string) string {
r := []rune(s)
for i, j := 0, len(r)-1; i < j; i, j = i+1, j-1 {
r[i], r[j] = r[j], r[i]
}
return string(r)
}
Workspaces(go work)
支持同时开发多个模块。
// go.work
go 1.18
use (
./myapp
./mylib
)
net/netip 包
更好的 IP 地址类型。
import "net/netip"
func main() {
ip, err := netip.ParseAddr("192.0.2.1")
if err == nil {
println(ip.Is4(), ip.Is6(), ip.String())
}
prefix, _ := netip.ParsePrefix("10.0.0.0/8")
println(prefix.Contains(ip)) // false
}
Go 1.19(2022-08-02)
修订后的内存模型
清晰定义了 sync 和 atomic 操作的 happens-before 关系。
软内存限制(Soft Memory Limit)
import "runtime/debug"
func main() {
// 设置软内存限制:当 GC 堆达到此阈值时更积极回收
debug.SetMemoryLimit(512 * 1024 * 1024) // 512 MB
}
原子类型
import "sync/atomic"
func main() {
var b atomic.Bool
b.Store(true)
println(b.Load()) // true
var c atomic.Int64
c.Add(42)
c.CompareAndSwap(42, 100)
println(c.Load()) // 100
var p atomic.Pointer[string]
hello := "hello"
p.Store(&hello)
println(*p.Load())
}
改进的文档注释
支持 doc 注释中的链接、列表和标题。
// Package example 展示了 Go 1.19 的文档注释改进。
//
// # 这是一个标题
//
// 支持列表:
// - 项目 1
// - 项目 2
//
// 链接: [net/http] 或 [自定义链接](https://example.com)
package example
// 这个函数有 [特殊含义].
//
// [特殊含义]: https://example.com
func Foo() {}
Go 1.20(2023-02-01)
Profile-Guided Optimization(PGO,实验性)
使用性能分析文件指导编译优化。
# 1. 收集性能分析
go test -bench=. -cpuprofile cpu.pprof
# 2. 使用 PGO 编译(默认查找 default.pgo)
go build -pgo=auto # 使用 default.pgo(如果有)
go build -pgo=cpu.pprof
context.WithCancelCause
import (
"context"
"errors"
)
func main() {
causeErr := errors.New("自定义取消原因")
ctx, cancel := context.WithCancelCause(context.Background())
cancel(causeErr)
// 获取取消原因
err := context.Cause(ctx)
println(err.Error()) // "自定义取消原因"
}
errors.Join
import "errors"
func main() {
err1 := errors.New("错误 1")
err2 := errors.New("错误 2")
// 合并多个错误
combined := errors.Join(err1, err2)
println(combined.Error())
// 检查是否包含任一错误
println(errors.Is(combined, err1)) // true
}
strings.Clone / bytes.Clone
import "strings"
func main() {
s := "hello world"
// Clone 返回 s 的一个独立副本
cloned := strings.Clone(s)
_ = cloned
}
Go 1.21(2023-08-08)
新内置函数:min、max、clear
func main() {
// min / max
println(min(3, 7, 2, 9)) // 2
println(max(3.14, 2.72)) // 3.14
// 字符串按字典序比较
println(min("abc", "abd")) // "abc"
// clear — 清空 map 或切片元素
m := map[string]int{"a": 1, "b": 2}
clear(m)
println(len(m)) // 0
s := []int{1, 2, 3, 4}
clear(s) // 将所有元素置零
println(s[0], s[1], s[2], s[3]) // 0 0 0 0
}
新标准库包
import (
"cmp"
"log/slog"
"maps"
"slices"
)
func main() {
// slices 包
s := []int{3, 1, 4, 1, 5}
slices.Sort(s)
println(slices.BinarySearch(s, 4)) // 3 true
// maps 包
m1 := map[string]int{"a": 1, "b": 2}
m2 := map[string]int{"b": 3, "c": 4}
maps.Copy(m1, m2) // m1: {"a": 1, "b": 3, "c": 4}
// cmp 包
r := cmp.Compare(3, 5)
println(r) // -1
// log/slog — 结构化日志
logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
logger.Info("用户登录", "user", "alice", "ip", "192.168.1.1")
}
WASI 支持
GOOS=wasip1 GOARCH=wasm go build -o main.wasm main.go
toolchain 指令
// go.mod
module example.com/myproject
go 1.21
toolchain go1.21.0
Go 1.22(2024-02-06)
⭐ 循环变量作用域修复
每个循环迭代获得自己的变量,不再共享。
// Go 1.21 及之前的问题版本
func main() {
var funcs []func()
for _, v := range []int{1, 2, 3} {
// Go 1.21: 所有闭包捕获同一个 v
// Go 1.22: 每个迭代有独立的 v
funcs = append(funcs, func() {
print(v)
})
}
for _, f := range funcs {
f() // Go 1.22: 1 2 3
}
}
整数范围循环
func main() {
// 直接迭代整数
for i := range 5 {
println(i) // 0 1 2 3 4
}
}
增强的 HTTP ServeMux
import "net/http"
func main() {
mux := http.NewServeMux()
// 方法路由
mux.HandleFunc("GET /users", listUsers)
mux.HandleFunc("POST /users", createUser)
mux.HandleFunc("PUT /users/{id}", updateUser)
mux.HandleFunc("DELETE /users/{id}", deleteUser)
// 路径参数
mux.HandleFunc("GET /users/{id}", func(w http.ResponseWriter, r *http.Request) {
id := r.PathValue("id") // 获取路径参数
w.Write([]byte("user: " + id))
})
// 通配符
mux.HandleFunc("GET /files/{path...}", func(w http.ResponseWriter, r *http.Request) {
path := r.PathValue("path")
w.Write([]byte("file: " + path))
})
http.ListenAndServe(":8080", mux)
}
math/rand/v2
import (
mathrand "math/rand/v2"
)
func main() {
// 简化 API,不再需要 seed
n := mathrand.IntN(100) // 0-99 随机数
println(n)
// 64 位随机
x := mathrand.Uint64()
println(x)
}
Go 1.23(2024-08-13)
⭐ Range Over Iterator(迭代器函数)
自定义类型可以作为 range 表达式,支持 iter.Seq 和 iter.Seq2。
import "iter"
// 向后迭代切片
func Backward(s []int) iter.Seq[int] {
return func(yield func(int) bool) {
for i := len(s) - 1; i >= 0; i-- {
if !yield(s[i]) {
return
}
}
}
}
func main() {
s := []int{1, 2, 3, 4, 5}
// 使用自定义迭代器
for v := range Backward(s) {
println(v) // 5 4 3 2 1
}
}
// Seq2 示例 — 遍历 map
func MapEntries[K comparable, V any](m map[K]V) iter.Seq2[K, V] {
return func(yield func(K, V) bool) {
for k, v := range m {
if !yield(k, v) {
return
}
}
}
}
iter / unique / structs 包
import (
"iter"
"unique"
)
// unique 包 — 字符串驻留(interning)
func main() {
h1 := unique.Make("hello")
h2 := unique.Make("hello")
println(h1 == h2) // true
println(h1.Value()) // "hello"
}
// structs 包 — 结构体布局控制
import "structs"
type MyStruct struct {
_ structs.HostLayout // 指示使用 C 结构体布局
X int64
Y float64
}
Timer/Ticker GC 改进
不再被引用时可立即被 GC 回收。
Go 1.24(2025-02-11)
⭐ Swiss Tables 实现
Go 的 map 底层实现切换为 Swiss Table,显著提升性能。
// 无需代码更改,现有 map 自动受益
func main() {
m := make(map[string]int)
// 性能提升 10-50%,取决于使用模式
for i := range 1000000 {
m["key"+string(rune(i))] = i
}
}
泛型类型别名(Generic Type Aliases)
package main
// 泛型类型别名
type Vector[T any] = []T
func main() {
v := Vector[int]{1, 2, 3}
println(v[0]) // 1
// 带约束的别名
type OrderedSlice[T cmp.Ordered] = []T
var s OrderedSlice[int] = []int{3, 1, 2}
slices.Sort(s)
}
omitzero JSON 标签
import "encoding/json"
type Config struct {
Name string `json:"name,omitzero"`
Timeout int `json:"timeout,omitzero"` // 零值时省略
}
func main() {
c := Config{} // Timeout 为零值
data, _ := json.Marshal(c)
println(string(data)) // 不包含 timeout
}
crypto/rand.Text
import "crypto/rand"
func main() {
// 生成安全的随机字符串(Base64 编码,22 字符)
token, err := rand.Text()
if err == nil {
println(token) // 例如 "aB3x...(22字符)"
}
}
FIPS 140-3 合规支持
import _ "crypto/tls/fipsonly"
func main() {
// 启用 FIPS 140-3 模式
// 只使用经 FIPS 认证的加密实现
}
Go 1.25(2025-08-12)
容器感知的 GOMAXPROCS
在 Linux 容器中自动感知 CPU 限制。
import "runtime"
func main() {
// 在 Kubernetes 等容器环境中,
// 如果 cgroup 限制了 CPU,GOMAXPROCS 自动适配
println(runtime.GOMAXPROCS(0))
// 无需手动设置,运行时自动调整
}
⭐ 实验性 Green Tea GC(GOEXPERIMENT=greenteagc)
新的 GC 实现,通过更好的局部性和 CPU 可扩展性,减少 10-40% 的 GC 开销。
# 编译时启用
GOEXPERIMENT=greenteagc go build .
encoding/json/v2(实验性,GOEXPERIMENT=jsonv2)
// 目前需要通过 GOEXPERIMENT=jsonv2 启用
// import "encoding/json/v2"
Trace Flight Recorder(飞行记录器)
import "runtime/trace"
func main() {
fr := trace.NewFlightRecorder()
fr.Start()
// ... 业务逻辑 ...
// 发生重要事件时保存最近的 trace 数据
if true { // 假设发生错误
snap, _ := fr.Snapshot()
// 保存快照到文件进行分析
// snap 包含最近几秒的 trace 数据
_ = snap
}
fr.Stop()
}
sync.WaitGroup.Go 方法
import "sync"
func main() {
var wg sync.WaitGroup
// 简化 goroutine 创建和计数
wg.Go(func() {
// 自动调用 wg.Add(1) 和 wg.Done()
println("工作中的 goroutine")
})
wg.Wait()
}
testing/synctest 毕业
import (
"testing"
"testing/synctest"
)
func TestConcurrent(t *testing.T) {
synctest.Run(func() {
// 在隔离的"气泡"中运行
// 使用虚拟化时间,无需真实等待
ch := make(chan int)
go func() {
ch <- 42
}()
result := <-ch
if result != 42 {
t.Errorf("expected 42, got %d", result)
}
})
}
go doc -http 服务器
go doc -http :6060
# 在浏览器中打开 http://localhost:6060
DWARF 5 调试信息
go build -ldflags='-w' . # DWARF 5 默认启用
Go 1.26(2026-02-10)
⭐ Green Tea GC 成为默认
Go 1.25 实验性的 Green Tea GC 现在默认启用,减少 10-40% 的 GC 开销。
# Green Tea GC 默认启用
go build .
# 如需关闭(仅限 1.26)
GOEXPERIMENT=nogreenteagc go build .
new(expr) 语法
允许创建指向字面量的指针。
// Go 1.26 之前需要辅助函数
func ptr[T any](v T) *T { return &v }
func main() {
// Go 1.26: 内联创建指针
p := new(int64(300))
println(*p) // 300
// 更加简洁
config := new(Config{Name: "example", Port: 8080})
println(config.Name)
// 与泛型结合
items := []*int{new(1), new(2), new(3)}
for _, item := range items {
println(*item)
}
}
type Config struct {
Name string
Port int
}
errors.AsType[T] — 泛化类型断言
import "errors"
type MyError struct {
Msg string
Code int
}
func (e MyError) Error() string { return e.Msg }
func doSomething() error {
return MyError{"请求失败", 404}
}
func main() {
err := doSomething()
// Go 1.26: 编译时安全的泛型版本
if myErr, ok := errors.AsType[MyError](err); ok {
println(myErr.Code) // 404
}
// 旧的方式
var target MyError
if errors.As(err, &target) {
println(target.Code)
}
}
递归类型约束(Self-referential Generic Types)
泛型类型可以在自身类型参数列表中引用自身。
// 递归类型约束:支持链式表达式的泛型接口
type Adder[A Adder[A]] interface {
Add(A) A
}
// 具体实现
type MyInt int
func (m MyInt) Add(other MyInt) MyInt {
return m + other
}
func main() {
a := MyInt(5)
b := a.Add(MyInt(3))
println(b) // 8
}
crypto/hpke 包
实现 RFC 9180 混合公钥加密(Hybrid Public Key Encryption),包括后量子混合 KEM。
import (
"crypto/hpke"
"crypto/rand"
)
func main() {
// 生成密钥对
sk, pk, _ := hpke.GenerateKey(rand.Reader)
// 使用 HPKE 加密
info := []byte("应用程序信息")
plaintext := []byte("秘密消息")
ciphertext, _ := hpke.Seal(pk, info, nil, plaintext)
// 解密
decrypted, _ := hpke.Open(sk, info, nil, ciphertext)
println(string(decrypted))
}
slog.MultiHandler / slog.GroupAttrs
import (
"log/slog"
"os"
)
func main() {
// 将日志同时输出到文件和终端
file, _ := os.Create("app.log")
defer file.Close()
handler := slog.NewMultiHandler(
slog.NewTextHandler(os.Stdout, nil),
slog.NewJSONHandler(file, nil),
)
logger := slog.New(handler)
logger.Info("你好", "user", "alice")
}
simd/archsimd(实验性,GOEXPERIMENT=simd)
提供架构特定的 SIMD 操作。
// 需要 GOEXPERIMENT=simd 编译
// import "simd/archsimd"
更快 cgo 调用
基线运行时开销减少约 30%。
crypto/tls 后量子密钥交换
SecP256r1MLKEM768 和 SecP384r1MLKEM1024 混合密钥交换默认启用。
import "crypto/tls"
func main() {
// 默认启用的后量子安全 TLS 连接
conn, err := tls.Dial("tcp", "example.com:443", nil)
if err == nil {
// 连接使用后量子 + 椭圆曲线混合密钥交换
conn.Close()
}
}
reflect 迭代器
import "reflect"
type User struct {
Name string
Age int
}
func main() {
u := User{"Alice", 30}
v := reflect.ValueOf(u)
// Go 1.26: 使用迭代器遍历字段
for name, fv := range v.Fields() {
println(name, fv.Interface())
}
// 遍历类型的方法
t := reflect.TypeOf(u)
for name, method := range t.Methods() {
println(name, method.Name)
}
}
io.ReadAll 性能提升约 2x
import (
"io"
"strings"
)
func main() {
r := strings.NewReader("hello world")
// Go 1.26: 约 2 倍速度提升,更少分配
data, _ := io.ReadAll(r)
println(string(data))
}
bytes.Buffer.Peek
import "bytes"
func main() {
var buf bytes.Buffer
buf.WriteString("hello world")
// 预览前 5 个字节而不消耗
peeked := buf.Peek(5)
println(string(peeked)) // "hello"
// 缓冲区内容不变
println(buf.Len()) // 11
}
发布节奏与支持政策
| 版本 | 发布日期 | 主要亮点 | 支持状态 |
|---|---|---|---|
| 1.0 | 2012-03-28 | 首个稳定版 | ❌ 已终止 |
| 1.1 | 2013-05-13 | 竞态检测器、方法值 | ❌ 已终止 |
| 1.2 | 2013-12-01 | 完整切片表达式 | ❌ 已终止 |
| 1.3 | 2014-06-18 | GC 改进、连续 goroutine 栈 | ❌ 已终止 |
| 1.4 | 2014-12-10 | go generate |
❌ 已终止 |
| 1.5 | 2015-08-19 | 自举、并发 GC、internal 包 | ❌ 已终止 |
| 1.6 | 2016-02-17 | HTTP/2、vendor | ❌ 已终止 |
| 1.7 | 2016-08-15 | context 包、SSA 后端 | ❌ 已终止 |
| 1.8 | 2017-02-16 | GC < 100µs、sort.Slice | ❌ 已终止 |
| 1.9 | 2017-08-24 | 类型别名、math/bits | ❌ 已终止 |
| 1.10 | 2018-02-16 | 构建缓存、测试缓存 | ❌ 已终止 |
| 1.11 | 2018-08-24 | Go Modules(实验性)、WASM | ❌ 已终止 |
| 1.12 | 2019-02-25 | 模块改进 | ❌ 已终止 |
| 1.13 | 2019-09-03 | 错误包装 %w、数字字面量 | ❌ 已终止 |
| 1.14 | 2020-02-25 | 模块生产就绪、零开销 defer | ❌ 已终止 |
| 1.15 | 2020-08-11 | 链接器改进、体积缩小 | ❌ 已终止 |
| 1.16 | 2021-02-16 | 模块默认启用、go:embed | ❌ 已终止 |
| 1.17 | 2021-08-16 | 切片→数组指针 | ❌ 已终止 |
| 1.18 | 2022-03-15 | ⭐泛型⭐、Fuzzing、Workspaces | ❌ 已终止 |
| 1.19 | 2022-08-02 | 原子类型、软内存限制 | ❌ 已终止 |
| 1.20 | 2023-02-01 | PGO、errors.Join | ❌ 已终止 |
| 1.21 | 2023-08-08 | min/max/clear、slog、slices/maps | ❌ 已终止 |
| 1.22 | 2024-02-06 | ⭐循环变量修复⭐、增强 ServeMux | ❌ 已终止 |
| 1.23 | 2024-08-13 | Range Over Iterator、iter 包 | ❌ 已终止 |
| 1.24 | 2025-02-11 | Swiss Table、泛型别名、omitzero | ❌ 已终止 |
| 1.25 | 2025-08-12 | 实验性 Green Tea GC、synctest、容器感知 GOMAXPROCS | ✅ 安全更新 |
| 1.26 | 2026-02-10 | Green Tea GC 默认、new(expr)、errors.AsType、crypto/hpke | ✅ 当前版本 |
| 1.26.5 | 2026-07 左右 | 安全修复和 Bug 修复 | ✅ 当前版本 |
关键里程碑
| 里程碑 | 版本 | 说明 |
|---|---|---|
| 🏁 首次发布 | 1.0 | 稳定版 + 兼容性承诺 |
| 📦 包管理 | 1.11~1.16 | Modules 从实验到默认 |
| ⭐ 泛型 | 1.18 | 类型参数:最重大的语言变化 |
| ♻️ 循环变量 | 1.22 | 循环变量作用域修复 |
| 🌀 迭代器 | 1.23 | Range Over Iterators |
| 🗺️ Map 重写 | 1.24 | Swiss Table |
| 🌿 Green Tea GC | 1.25→1.26 | 新一代 GC 从实验到默认 |
发布节奏:每 6 个月发布一个主版本(2 月和 8 月),只维护最近两个主版本的安全更新。
兼容性:Go 1 兼容性承诺确保 1.0 编写的代码仍能在 1.26 编译(少数例外需经兼容性委员会批准)。
文档最后更新:2026-07-22