Go 1.20 RC1 发布

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,StringStringData

在 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 类型(例如普通接口 ordinary interfaces)现在可以满足comparable约束,即便类型实参 (type argument) 不是严格可比较类型。

  • 值比较

Go 语言规范进行了更新,结构体变量的值每次只比较一个字段,字段比较的顺序和字段在结构体里定义的顺序保持一致。一旦某个字段的值比较出现不一致,就会马上停止比较。

该变化没有对代码造成影响。

最后,由于 Go 1.20 尚处于开发阶段,目前公开的 Release Notes 也是草案状态。

展开阅读全文
发表评论

相关文章