您的位置:首页 > IT > 正文

Go 1.20 RC1 发布

来源:OSCHINA     时间:2022-12-12 17:17:33

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 != nils1 := (*[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 []stringt0 := [0]string(t)       // ok for nil slice tt1 := (*[0]string)(t)    // t1 == nilt2 := (*[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 类型

Comparable 类型(例如普通接口 ordinary interfaces)现在可以满足comparable约束,即便类型实参 (type argument) 不是严格可比较类型。

值比较

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

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

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

相关文章