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

Go 1.18

泛型进入日常 Go

类型参数减少重复实现,字符串分割与模糊测试让代码更简洁、更可靠。

查看发布说明 ↗
LEARN BY DOING

学习路线与升级检查

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

这一版怎么学

  • 01 · 泛型函数与类型约束

    为整数、浮点数等类型编写相同的聚合算法。

  • 02 · strings.Cut

    解析 key=value 一类只需要首次分割的数据。

  • 03 · 原生模糊测试

    给字符串解析、编解码和协议处理补充边界输入。

升级前检查

  • 通用算法先明确类型约束,不把泛型用在只需要接口的地方。
  • 检查 go.mod 的 go 版本,并确认编辑器和静态分析工具支持泛型。
  • 为解析器增加 fuzz seed,先验证正常输入和边界情况。

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

THE HIGHLIGHTS

这一版,值得关注 03

01语法

泛型函数与类型约束

函数和类型可以声明类型参数,在约束允许的操作范围内复用实现。

怎么用为整数、浮点数等类型编写相同的聚合算法。

旧版做法为每种类型分别写函数,或通过接口加类型断言处理。

注意事项~int 允许底层类型为 int 的自定义类型;约束应只包含算法需要的操作。

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

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

Go 1.18 · main.go
package main
import "fmt"
func Sum[T ~int | ~int64](values []T) T {
    var total T
    for _, value := range values { total += value }
    return total
}
func main() { fmt.Println(Sum([]int{2, 3, 5})) }
运行结果
10
02标准库

strings.Cut

一次分割返回前半段、后半段和是否找到分隔符,避免不必要的切片结果。

怎么用解析 key=value 一类只需要首次分割的数据。

旧版做法使用 SplitN 后再检查切片长度。

注意事项只匹配第一次出现;没有分隔符时,before 是原字符串,found 为 false。

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

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

Go 1.18 · main.go
package main
import ("fmt"; "strings")
func main() {
    key, value, found := strings.Cut("name=Ada", "=")
    fmt.Println(key, value, found)
}
运行结果
name Ada true
03开发体验

原生模糊测试

testing 支持 Fuzz 测试,自动探索输入以寻找崩溃和违反约束的情况。

怎么用给字符串解析、编解码和协议处理补充边界输入。

旧版做法手动列举测试数据,或使用外部模糊测试工具。

注意事项普通 go test 只运行 seed;持续探索需要 go test -fuzz=FuzzCut -fuzztime=10s。

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

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

Go 1.18 · lesson_test.go
package example
import ("strings"; "testing")
func FuzzCut(f *testing.F) {
    f.Add("name=Ada")
    f.Fuzz(func(t *testing.T, text string) {
        before, after, found := strings.Cut(text, "=")
        if found && before + "=" + after != text { t.Fatal("round trip failed") }
    })
}

FROM THE SOURCE

官方完整变更目录 72

What’s New ↗

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

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

动手练习

把泛型 Sum 改成支持 float64,并计算 1.5 + 2.5。

提示:把 ~float64 加入约束,类型推断会根据传入切片选择 T。

展开参考答案
Go 1.18 · main.go
package main
import "fmt"
func Sum[T ~int | ~float64](values []T) T {
    var total T
    for _, value := range values { total += value }
    return total
}
func main() { fmt.Println(Sum([]float64{1.5, 2.5})) }
运行结果
4