一尘不染

如何在Go中获取切片的基础数组?

go

假设我有以下长度为3的整数数组:

nums := [3]int{1,2,3}

然后我只抓了前两个项目

numSlice := nums[:2]

cap在这两种情况下,调用numSlice和nums都会产生3,分别len产生2和3。

如果我随后附加到该slice(numSlice = append(numSlice, 10)),则基础数组(nums)现在为[1 2 10]cap两者的值均保持为3,因为切片的基础数组相同,并且切片的len现在为3。

但是,如果我再次追加到该片(numSlice = append(numSlice, 20)),则cap该片的基础数组必须更改-
我们看到的情况是,现在numSlice增加了一倍,而len现在是4。

很抱歉过度解释,只是一步一步地讲解,但是有人可以向我解释底层数组的幕后情况以及如何获得对新数组的引用吗?


阅读 226

收藏
2020-07-02

共1个答案

一尘不染

首先,如果您还没有的话,应该阅读有关slice内部构件的官方博客文章。那应该清除一切。

现在访问的底层数组,你可以使用的组合reflectunsafe。特别是,reflect.SliceHeader
包含一个Data字段,该字段包含一个指向切片的基础数组的指针。

改编自unsafe包装文档的示例:

s := []int{1, 2, 3, 4}
hdr := (*reflect.SliceHeader)(unsafe.Pointer(&s))
data := *(*[4]int)(unsafe.Pointer(hdr.Data))
2020-07-02