前言
Go官方团队在2022.12.08发布了Go 1.20 rc1(release candidate)版本,Go 1.20的正式release版本预计会在2023年2月份发布。
让我们先睹为快,看看Go 1.20给我们带来了哪些变化。(文末有彩蛋!)
安装方法:
$ go install golang.org/dl/go1.20rc1@latest
$ go1.20rc1 download
这是Go 1.20版本更新内容详解的第1篇,欢迎大家关注公众号,及时获取本系列最新更新。
Go 1.20发布清单
和Go 1.19相比,改动内容适中,主要涉及语言(Language)、可移植性(Ports)、工具链(Go Tools)、运行时(Runtime)、编译器(Compiler)、汇编器(Assembler)、链接器(Linker)和核心库(Core library)等方面的优化。
我们逐个看看具体都有哪些变化。
语言变化
Go 1.20在语言层面带来了4个变化。
slice转数组
Go1.17在语言层面开始支持将slice转为指向数组的指针。
示例如下:
s := make([]byte, 2, 4)
// 将s这个slice转为指向byte数组的指针s0
// 其中[0]byte里的0表示数组的长度,虽然长度为0,但值不等于nil
s0 := (*[0]byte)(s) // s0 != nil
fmt.Printf("%T")
// 将s[1:]这个slice转为指向byte数组的指针s1
// s1指向的数组的长度为1
s1 := (*[1]byte)(s[1:]) // &s1[0] == &s[1]
// 将s这个slice转为指向byte数组的指针s2
// s2指向的数组的长度为2
s2 := (*[2]byte)(s) // &s2[0] == &s[0]
// 将s这个slice转为指向byte数组的指针s4
// s4指向的数组的长度为4
s4 := (*[4]byte)(s) // panics: len([4]byte) > len(s)
注意:slice转为指向数组的指针时,如果数组定义的长度超过了slice的长度,会抛panic。
所以上面s4 := (*[4]byte)(s)
这行代码虽然可以编译通过,但是会出现runtime panic。
Go 1.20之前不支持将slice直接转为数组,如果要转,得先转为指向数组的指针,再转为数组,如下面代码所示:
s := make([]byte,