GO 1.20 新特性

发布时间:2023.02.01

官方说明:Go 1.20 Release Notes – The Go Programming Language

特性:

  • Go 1.19 重要的变化有:

    • Go 内存模型,详细参考官方文档:https://go.dev/ref/mem。随着内存模型的更新,Go 1.19 在 sync/atomic 包引入了新的类型:types Bool, Int32, Int64, Uint32, Uint64, Uintptr 和 Pointer 等,这让原子值的使用更方便。
    • 工具方面,文档格式增强。文档注释中添加了对链接、列表和更清晰标题的支持。详情见:https://go.dev/doc/comment。
    • runtime 方面,最值得关注的变化就是增加了 runtime/debug.SetMemoryLimit,可以限制 Go 的内存使用。

    其他是一些库的小变化。
    详细变化可以查看官方 Release Notes:https://go.dev/doc/go1.19。

    Go 1.18 新特性

    时间:2022.03

    官方说明:Go 1.18 Release Notes – The Go Programming Language

    主要特性:

    具体来说,包含以下几大特性:

    • 泛型
    • 模糊测试(Fuzzing)
    • 工作空间(Workspaces)
    • 20% 性能提升:Apple M1、ARM64 和 PowerPC64 用户开心了!由于 Go 1.17 的寄存器 ABI 调用约定扩展到这些架构,Go 1.18 包括高达 20% 的 CPU 性能改进。

    分析材料参见

    • 主要特性:

      • 从切片到数组指针的转换: []T 类型的表达式 s 现在可以转换为数组指针类型 *[N]T
      • go modules 支持“修剪模块图”(Pruned module graphs):go mod tidy -go=1.17
      • 编译器带来了额外的改进:即一种传递函数参数和结果的新方法,程序性能提高了约 5%,amd64 平台的二进制大小减少了约 2%。
      • unsafe包新增了unsafe.Add和unsafe.Slice
      • go.mod 中添加 // Deprecated: 注释来弃用模块
      • net包:
      • url参数解析增加对“;”的支持变化(原先 example?a=1;b=2&c=3 会解析成 map[a:[1] b:[2] c:[3]], 现在解析成map[c:[3]])
      • 增加 IP.IsPrivate 判断私有 IP
      • a.b.c.d 格式的 ip v4 地址不允许每段有前缀 0(因为某些系统会认为前缀 0 表示 8进制)

      Go 1.16 新特性

      时间:2021.02

      官方说明:Go 1.16 Release Notes – The Go Programming Language

      主要特性:

      • GO111MODULE 默认为 on
      • 支持编译阶段将静态资源文件打包进编译好的程序中,并提供访问这些文件的能力://go:embed

      Go 1.15 新特性

      时间:2020.08

      官方说明:Go 1.15 Release Notes – The Go Programming Language

      主要特性:

      • 改进了对高核心数的小对象的分配
      • 编译器/汇编器/链接器的优化:二进制大小减少了约 5%,减少了链接器资源的使用(时间和内存)并提高了代码的稳健性/可维护性。
      • 内置了time/tzdata包:允许将时区数据库嵌入到程序中

      Go 1.14 新特性

      时间:2020.02

      官方说明:Go 1.14 Release Notes – The Go Programming Language

      主要特性:

      • Go Module已可用于生产使用
      • 嵌入具有重叠方法集的接口
      • 改进了defer的性能
      • goroutines 异步可抢占
      • 页面分配器更高效
      • 内部定时器更高效

      Go 1.13 新特性

      时间:2019.09

      官方说明:Go 1.13 Release Notes – The Go Programming Language

      主要特性:

      • 优化sync.Pool,sync 包的 Pool 组件得到改进,得其中的资源不会在垃圾回收时被清除(通过新机制里引入的缓存,两次垃圾回收之间没有被使用过的实例才会被清除)
      • 重了逃逸分析逻辑,使得 Go 程序减少了堆上的分配次数
      • go 命令默认使用 Go module mirror and Go checksum database下载和验证模块
      • 对数字文字的改进
      • 错误换行
      • 默认开启 TLS 1.3

      Go 1.12 新特性

      时间:2019.02

      官方说明:Go 1.12 Release Notes – The Go Programming Language

      主要特性:

      • 改进了Go modules
      • 在analysis包基础上重写了 go vet 命令

      Go 1.11 新特性

      时间:2018.08

      官方说明:Go 1.11 Release Notes – The Go Programming Language

      主要特性:

      • Go modules

      Go 1.10 新特性

      时间:2018.02

      官方说明:Go 1.10 Release Notes – The Go Programming Language

      主要特性:

      • go test with cache:go test命令可以缓存测试结果
      • go build 命令会缓存最近构建过的包,从而加快了构建过程
      • 明确预声明类型(predeclared type)是defined type还是alias type
      • 移除spec中对method expression: T.m中T的类型的限制
      • 默认的GOROOT
      • 增加GOTMPDIR变量
      • 通过cache实现增量构建,提高go tools性能
      • go tool pprof做了一个较大的改变:增加了Web UI
      • 标准库新增strings.Builder
      • 标准库bytes包的几个方法Fields, FieldsFunc, Split和SplitAfter在底层实现上有变化,使得外部展现的行为有所变化

      Go 1.9 新特性

      时间:2017.08

      官方说明:Go 1.9 Release Notes – The Go Programming Language

      主要特性:

      • 提升了垃圾收集器和编译器
      • 增加了类型别名
      • 新增了sync.Map
      • time包更加安全
      • testing包新增helper方法
      • 支持渐进式代码重构
      • 引入了类型别名并提升了运行时和工具支持

      Go 1.8 新特性

      时间:2017.02

      官方说明:Go 1.8 Release Notes – The Go Programming Language

      主要特性:

      • 优化编译
      • CPU 时间在 32 位 ARM 系统上减少了 20-30%, 还针对 64 位 x86 系统进行了一些适度的性能改进。编译器和链接器变得更快。
      • 编译时间应该比 Go 1.7 改进了大约 15%
      • Go 1.7中进入标准库的context,提供了取消和超时机制。
      • Go 1.8 让标准库中更多package使用(支持)context,包括 database/sql,net 包, net/http 包中的 Server.Shutdown等
      • 对垃圾回收器改进,使两次垃圾回收的暂停时间减小到了毫秒级
      • 同时识别了剩余仍未解决的暂停模式,并在下一个版本中得到修复。修复后,通常情况下暂停时间能- 控制在 100 微秒左右,甚至能低至 10 微秒。
      • 改进了 defer 函数
      • 部分标准库使用context包来改造
      • sort 包中新添加的 Slice 函数,对切片进行排序变得比之前简单得多

      Go 1.7 新特性

      时间:2016.08

      官方说明:Go 1.7 Release Notes – The Go Programming Language

      主要特性:

      • context包转正
      • 编译时间显着加快:二进制文件大小减少了 20-30%, CPU 时间减少了 5-35%
      • 垃圾收集器的加速和标准库的优化
      • go tool trace改进

      Go 1.6 新特性

      时间:2016.02

      官方说明:Go 1.6 Release Notes – The Go Programming Language

      主要特性:

      • 增加对于 HTTP/2 协议的默认支持
      • 再一次降低了垃圾回收器的延迟
      • runtime改变了打印程序结束恐慌的方式。现在只打印发生panic的 goroutine 的堆栈,而不是所有现有的 goroutine
      • 默认启用vendor目录
      • sort.Sort 内部的算法进行了改进,运行速度提高了约 10%

      Go 1.5 新特性

      时间:2015.08

      官方说明:Go 1.5 Release Notes – The Go Programming Language

      主要特性:

      • 垃圾回收器被完全重新设计实现: 基于并发的回收期,GC延迟显著降低,来自Twitter生产案例从300ms下降到30ms
      • 调度程序的相关改进允许将默认的 GOMAXPROCS 值(并发执行的 goroutine 的数量)从 1 更改为逻辑 CPU 的数量。在以前的版本中,默认值为 1
      • go tool trace:可以在运行时可视化跟踪程序,追踪信息可在测试或运行期间生成,展示在浏览器窗口中
      • map语法的更改:由于疏忽,允许从slice literals中省略元素类型的规则未应用于map。在1.5版本得到了修正,以下两种定义map的方式从1.5及之后都可以(即可以省略Point的类型)

      Go 1.4 新特性

      时间:2014.02

      官方说明:Go 1.4 Release Notes – The Go Programming Language

      主要特性:

      • For-range loops支持新语法 1234567891011121314151617
      package mainimport “fmt”func main() { sli := []string{“shandong”, “zhejiang”, “guangdong”, “jiangsu”}  for k, v := range sli {   fmt.Println(“k-v:, k, v) // go 1.3及之前的For-range loops } for range sli { fmt.Println(“从1.4开始这种写法是可以通过编译的”)   } }
      • Android 的官方支持包golang.org/x/mobile随该版本一同发布,使开发者可以仅用 Go 代码编写简单的 Android 应用。
      • 之前用 C 和汇编语言编写的大多数运行时已转换为用 Go 语言实现 && 使用了更精准的垃圾收集器,堆栈大小减少了 10~30%
      • 发布 go generate 命令,此命令会扫描//go:generate 指令提供的信息生成代码,简化了代码生成的方式。 Generating code
      • 引入了Internal包
      • Go 的项目代码管理工具从 Mercurial 切换为 Git,与此同时,项目也从 Google Code 迁移到了 Github 上

      Go 1.3 新特性

      时间:2014.06

      官方说明:Go 1.3 Release Notes – The Go Programming Language

      主要特性:

      • 堆栈管理得到了重要改善
      • 发布了 sync 包的 Pool 组件
      • 改进了channel的实现,提升了性能

      Go 1.2 新特性

      时间:2013.12

      官方说明:Go 1.2 Release Notes – The Go Programming Language

      主要特性:

      • Three-index slices
      • go test 命令支持代码覆盖率报告,并提供新的 go tool cover 命令输出代码测试覆盖率的统计信息. The cover story

      Go 1.1 新特性

      时间:2013.05

      官方说明:Go 1.1 Release Notes – The Go Programming Language

      主要特性:

      • 增强语言特性(编译器、垃圾回收机制、映射、goroutine 调度器)与性能。

      Go 1.0 新特性

      时间:2012.03

      官方说明:Go 1 Release Notes – The Go Programming Language
      主要特性:

      • 承诺兼容性,确保向后兼容 Go 1 and the Future of Go Programs – The Go Programming Language

      参考资料

      1. release history
      2. 历史版本总结