写点什么

Go1.17 正式发布 -- 切片转为数组指针

用户头像
草原狼
关注
发布于: 1 小时前

go 1.17 已经于今天正式发布了,其中大部分更改都在实现工具链、运行时库的实现。并且继续保持着向后兼容。其中主要有一个从切片到数组指针的转换。

示例

现在可以将切片 []t 转为数组指针 *[n]t,能够产生指向切片底层数组的指针,如果切片的长度小于数组的长度,则会发生 panic。

来看下官方例子:


s := make([]byte, 2, 4) // len(s) == 2, cap(s) == 4s0 := (*[0]byte)(s)      // s0 != nil ,len(s0) == 0s1 := (*[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) // t0 == nilt1 := (*[1]string)(t) // panics: len([1]string) > len(t)
u := make([]byte, 0)u0 := (*[0]byte)(u) // u0 != nil,len(u0)==0
复制代码

再来个例子,可以看到的确是指向同一块数组了。

	s := make([]byte, 2, 4) // len(s) == 2, cap(s) == 4	s[0] = 1	s[1] = 2	fmt.Printf("s:%v\n", s) // s:[1 2]	s1 := (*[2]byte)(s)     // &s2[0] == &s[0]	s1[1] = 3	fmt.Printf("s1:%v\n", s1) //s1:&[1 3]	fmt.Printf("s:%v\n", s) //s:[1 3]
复制代码


用处

在一些场景可以避免内存拷贝,比如官方标准库例子:

go/sha512.go at master · golang/go (github.com)


可以看到将原来用 copy 的直接用 ap := (*[Size384]byte(sum[:]) 直接返回了一个指向切片对应数组的指针地址。所以如果有些对内存要求比较高的场景可以用此方法避免内存拷贝从而获取一些比较好的性能。

发布于: 1 小时前阅读数: 5
用户头像

草原狼

关注

还未添加个人签名 2019.05.08 加入

还未添加个人简介

评论

发布
暂无评论
Go1.17正式发布--切片转为数组指针