点击上方蓝色“Golang来啦”关注我哟
加个“星标”,天天 15 分钟,掌握 Go 语言
你好,我是小四,你情商高,也可以叫我四哥~
Go1.20 正式版本还没有发布,官方计划 2023 年 2 月份发布。不过,Go1.20rc 已经在 12 月 8 号发布了,一起来尝鲜。
语言特性方面主要有四个优化,其中最主要的添加了 切片转数组 功能。
其实在 Go1.17 版本,Go语言已经有 切片转数组指针 的功能。可以看 P 神的这篇文章[1],了解下详情。
引入 切片转数组指针 特性之后,bradfitz 在改造标准库时就有了下面这次更改[2]:
但是在代码 review 时,他发现这样写有点“丑”,需要先取得数组指针再解引用,然后返回数组。
所以他就想能不能直接通过切片取得数组,而不是数组指针。后面就有了这个提案[3]:切片转数组。
目前这个提案已经加入到 Go1.20 版本里,官方文档已经更新,如下:
下面是官方给出的例子:
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
对于切片转数组需要注意的点:
对于切片转数组指针,需要注意的点:
从实例我们可以看出,不管是转化成数组还是指针,底层都共享相同的数组。
文章: https://polarisxu.studygolang.com/posts/go/dynamic/go1.17-slice-to-array/
[2]更改: https://go-review.googlesource.com/c/go/+/322329/7/src/crypto/sha256/sha256.go
[3]提案: https://github.com/golang/go/issues/46505
资料下载
点击下方卡片关注公众号,发送特定关键字获取对应精品资料!
回复「电子书」,获取入门、进阶 Go 语言必看书籍。
回复「视频」,获取价值 5000 大洋的视频资料,内含实战项目(不外传)!
回复「路线」,获取最新版 Go 知识图谱及学习、成长路线图。
回复「面试题」,获取四哥精编的 Go 语言面试题,含解析。
回复「后台」,获取后台开发必看 10 本书籍。
对了,看完文章,记得点击下方的卡片。关注我哦~ 👇👇👇
如果您的朋友也在学习 Go 语言,相信这篇文章对 TA 有帮助,欢迎转发分享给 TA,非常感谢!