golang-1.18

  • 泛型 Generics 引入了对使用参数化类型的泛型代码的新支持, 达到了算法可复用的目的
  • 模糊测试 Fuzzing 提供了一种自动化测试的选择
  • Workspaces 解决 go mod 遗留下来的本地多模块开发依赖问题
  • CPU 性能提升 20%,
  • 支持了泛型,对比 1.17 编译时间可能会慢 15%~18%

golang-1.19

  • 文档注释支持链接、列表和更简洁的标题语法
  • 类型别名 Type Alias
  • flag 包增加 TextVar 函数
  • 安全并发 sync.Map 将读写分离的方式实现了某些特定场景下的性能提升
  • 增加 unix 构建标签统一标识类 *nix 系统
  • Go 的内存模型现在改进了sync/atomic 包的功能。sync/atomic 包现在与 Java、Swift 和 Rust 等语言使用的内存模型一致
  • os/exec 包不再接受 PATH 查找中的相对路径以加强额外的安全
  • 新的垃圾收集器可以通过设置 GOGC,指示 Go 开始下一个垃圾回收周期,具体取决于分配了多少新内存与仍有多少旧内存可用

golang-1.20

  • 允许从切片到数组的转换
  • comparable “放宽”了对泛型实参的限制
  • unsafe 包定义了三个新函数 SliceData、String 和 StringData
  • 允许在泛型函数/方法中进行类型声明
  • 支持 wrap multiple errors
  • time 包新增 DateTime、DateOnly 和 TimeOnly 三个 layout 格式常量
  • 新增 arena 包
  • 新 crypto/ecdh 包明确支持 NIST 曲线和 Curve25519 上的椭圆曲线 Diffie-Hellman 密钥交换
  • 返回一个包含错误列表的错误,如果错误类型实现了该方法 errors.Join,则可以再次获取错误列表
  • 新 http.ResponseController类型提供对接口未处理的扩展的按请求功能的 http.ResponseWriter 访问
  • httputil.ReverseProxy 转发代理包括一个新的钩子 Rewrite 函数,取代了以前的 Director 钩子
  • 新 context.WithCancelCause 函数提供了一种方法来取消具有给定错误的上下文。可以通过调用新 context.Cause函数来检索该错误
  • 新 os/exec.Cmd 字段 Cancel 并 WaitDelay 指定 Cmd 其关联 Context 被取消或进程退出时的行为
  • cover 工具现在可以收集整个程序的覆盖率概况,而不仅仅是单元测试
  • go 工具不再依赖于 $GOROOT/pkg 目录中预编译的标准库包存档,并且它们不再随发行版一起提供
  • go test -json已得到改进,以使其在出现杂散写入时更加健壮stdout
  • build 和 go install 其他与构建相关的命令现在接受一个 -pgo(profile-guided optimization) 启用配置文件引导优化的标志以及一个 -cover 用于整个程序覆盖率分析的标志
  • go 命令现在默认在没有 C 工具链的系统上禁用cgo
  • vet 工具报告了在并行运行的测试中可能发生的更多循环变量引用错误
  • 让 Go 编译器的编译速度重新回归到了 Go 1.17 的水准!相对 Go 1.19 提升 10% 左右

golang-1.21

  • min、max 和 clear
  • 明确了包初始化顺序算法
  • 对泛型的类型推断能力做了增强
  • Go 编译器会将 panic(nil) 替换为 panic(new(runtime.PanicNilError))
  • 一个循环语句定义一次的变量(loop var per loop)
  • PGO(profile-guided optimization) 默认开启
  • 大幅降低 GC 尾部延迟
  • 支持 WASI(WebAssembly System Interface)
  • log/slog
  • slices、maps 和 cmp
  • 增加 errors.ErrUnsupported
  • 增加 BoolFunc函数
  • 在 linux 上支持多路径 TCP
  • ValueOf 不再强制 Value 内容在堆上分配,而是允许在栈上分配 Value 的内容
  • 增加 OnceFunc、OnceValue 和 OnceValues 等语法糖函数
  • 新增 Testing 函数判断是否由 go test 运行的
  • 增加 QUICConn 以支持后续的 QUIC 实现
  • 新增 WithoutCancel、WithDeadlineCause、WithTimeoutCause 和 AfterFunc
  • 收集跟踪信息成本大幅降低
  • 升级到 Unicode 15.0.0 版本

golang-1.22

  • 试验特性 loop-var 转正落地
  • for range 新增了对整型表达式的支持
  • 基于 PGO(profile-guided optimization) 的构建可以比以前版本实现更高比例的调用去虚拟化(devirtualize)
  • go work 支持 vendor
  • go mod init 不再 care 其他 vendor 工具的配置文件
  • 改进 go test -cover 的输出
  • math/rand/v2
  • 增强 http.ServeMux 表达能力
Last Updated:
Contributors: Bob Wang