Go 版本演进:从 1.0 到 1.26.5 的重大变化与特性

本文档梳理了 Go 语言从 2012 年 1.0 发布到 2026 年 1.26.5 的主要语言特性、标准库更新、工具链改进和性能提升,每个特性附简单代码示例。

参考来源:


Go 1.0(2012-03-28)

Go 的第一个稳定版本。核心特性:

  • Go 1 兼容性承诺:后续版本保持向后兼容
  • 标准库net/httpencoding/jsontemplatecrypto/tls
  • 工具链go getgo fmtgo testgo 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.Iserrors.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.Timertime.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 废弃

推荐直接使用 ioos 包。

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)

修订后的内存模型

清晰定义了 syncatomic 操作的 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)

新内置函数:minmaxclear

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.Seqiter.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 后量子密钥交换

SecP256r1MLKEM768SecP384r1MLKEM1024 混合密钥交换默认启用。

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