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

时间:2016-04-19 01:16:42

标签: arrays go slice

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

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

然后我抓住前两个项目的片段

numSlice := nums[:2]

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

如果我然后附加到该切片(numSlice = append(numSlice, 10)),则基础数组(nums)现在为[1 2 10]cap两者都保持为3,因为切片的基础数组是相同的,切片的len现在是3.

但是,如果我再次附加到该片段(numSlice = append(numSlice, 20)),则片段的基础数组必须更改 - 我们看到当cap现在为numSlice加倍并且len现在是4.

很抱歉这个过于简单的解释,只是自己走过去,但是有人可以向我解释一下底层阵列会发生什么,以及如何获得对新阵列的引用?

1 个答案:

答案 0 :(得分:20)

首先,如果您还没有,请阅读this official blog post about slice internals。这应该清除一切。

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

根据unsafe包的文档改编的示例:

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