假设我有以下长度为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.
很抱歉这个过于简单的解释,只是自己走过去,但是有人可以向我解释一下底层阵列会发生什么,以及如何获得对新阵列的引用?
答案 0 :(得分:20)
首先,如果您还没有,请阅读this official blog post about slice internals。这应该清除一切。
现在,要访问基础数组,您可以使用reflect
和unsafe
的组合。特别是,reflect.SliceHeader
包含一个Data
字段,其中包含指向切片底层数组的指针。
根据unsafe
包的文档改编的示例:
s := []int{1, 2, 3, 4}
hdr := (*reflect.SliceHeader)(unsafe.Pointer(&s))
data := *(*[4]int)(unsafe.Pointer(hdr.Data))