Go 1.20 首个 RC 已发布,正式版计划明年 2 月推出。
下载地址:https://go.dev/dl/#go1.20rc1
值得注意的是,Go 1.20 是最后一个支持在 macOS 10.13 High Sierra 或 10.14 Mojave 上运行的版本。Go 1.21 将需要 macOS 10.15 Catalina 或更高版本。
此外,Go 1.20 添加了对 RISC-V 上的 FreeBSD (GOOS=freebsd
, GOARCH=riscv64
) 的实验性支持。
Go 1.20 目前在语法方面包含 4 项变化。
- 从 slice(切片)到数组的转换
Go 1.7 增加了从 slice (切片)到数组指针转换的功能,Go 1.20 对该功能进行了扩展——可直接从 slice 转换成数组。
比如给定一个 slicex
,[4]byte(x)
可以写成*(*[4]byte)(x)
。
s := make([]byte, 2, 4)
a0 := [0]byte(s)
a1 := [1]byte(s[1:]) // a1[0] == s[1]
a2 := [2]byte(s) // a2[0] == s[0]
a4 := [4]byte(s) // panics: len([4]byte) > len(s)
s0 := (*[0]byte)(s)// s0 != nil
s1 := (*[1]byte)(s[1:])// &s1[0] == &s[1]
s2 := (*[2]byte)(s)// &s2[0] == &s[0]
s4 := (*[4]byte)(s)// panics: len([4]byte) > len(s)
var t []string
t0 := [0]string(t) // ok for nil slice t
t1 := (*[0]string)(t)// t1 == nil
t2 := (*[1]string)(t)// panics: len([1]string) > len(t)
u := make([]byte, 0)
u0 := (*[0]byte)(u)// u0 != nil
- 标准库
unsafe
包定义了 3 个新函数:SliceData
,String
和StringData
在 Go 1.17 中,unsafe
包添加了 Slice 函数:
unsafe.Slice
: 对于*T
类型的ptr
表达式,unsafe.Slice(ptr, len)
返回一个[]T
类型的切片,其底层数组从ptr
开始, 其长度和容量为len
再加上 Go 1.20 新定义的 3 个函数,这 4 个函数提供了构造和解构 slice 以及字符串值的完整功能。
详情查看 https://tip.golang.org/ref/spec/#Package_unsafe。
- Comparable 类型
Comparable 类型(例如普通接口 ordinary interfaces)现在可以满足comparable
约束,即便类型实参 (type argument) 不是严格可比较类型。
- 值比较
Go 语言规范进行了更新,结构体变量的值每次只比较一个字段,字段比较的顺序和字段在结构体里定义的顺序保持一致。一旦某个字段的值比较出现不一致,就会马上停止比较。
该变化没有对代码造成影响。
最后,由于 Go 1.20 尚处于开发阶段,目前公开的 Release Notes 也是草案状态。