Go1.20 新特性:切片转数组
2022-12-10 22:3:29 Author: Go语言中文网(查看原文) 阅读量:25 收藏

Go1.20 正式版本还没有发布,官方计划 2023 年 2 月份发布。不过,Go1.20rc 已经在 12 月 8 号发布了,一起来尝鲜。

语言特性方面主要有四个优化,其中最主要的添加了 切片转数组 功能。

其实在 Go1.17 版本,Go语言已经有 切片转数组指针 的功能。可以看 P 神的这篇文章[1],了解下详情。

引入 切片转数组指针 特性之后,bradfitz 在改造标准库时就有了下面这次更改[2]

但是在代码 review 时,他发现这样写有点“丑”,需要先取得数组指针再解引用,然后返回数组。

所以他就想能不能直接通过切片取得数组,而不是数组指针。后面就有了这个提案[3]切片转数组

目前这个提案已经加入到 Go1.20 版本里,官方文档已经更新,如下:

下面是官方给出的例子:

s := make([]byte24)

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([]byte0)
u0 := (*[0]byte)(u)      // u0 != nil

对于切片转数组需要注意的点:

  • 当切片的长度小于数组的长度时会 panic,所以 a4 发生了 panic;
  • 对 nil 切片转化,得到长度为 0 的数组;

对于切片转数组指针,需要注意的点:

  • 与转数组一样,当切片的长度小于数组的长度时会 panic,所以 s4、t2 发生了 panic;
  • 将非空切片转为长度为 0 的数组,得到的指针不是 nil,比如 s0;将 nil 切片转为长度为 0 的数组,得到的指针为 nil,比如 t1;

从实例我们可以看出,不管是转化成数组还是指针,底层都共享相同的数组。

参考资料

[1]

文章: 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学习资料礼包,包含学习建议:入门看什么,进阶看什么。关注公众号 「polarisxu」,回复 ebook 获取;还可以回复「进群」,和数万 Gopher 交流学习。


文章来源: http://mp.weixin.qq.com/s?__biz=MzAxMTA4Njc0OQ==&mid=2651453848&idx=1&sn=dad9ced40f34d9b9968746d5e7650c54&chksm=80bb276ab7ccae7c06c5868ccc9695a13e25a2794888a9f688a5762fd13d80864fcf61cbd7b6#rd
如有侵权请联系:admin#unsafe.sh