2 回答
TA贡献1884条经验 获得超4个赞
切片基本上是一个指向内存的指针,带有一些附加信息:
1)当前使用的元素数量和
2)容量,即它能占用的剩余长度。
一开始我们创建了一个包含 6 个整数的切片,这使得 go 也创建了总大小为 6 的底层 int 数组。
here is your memory locations with addresses (content does not matter here)
* * * * * *
[0][1][2][3][4][5]
^
s points to the start of the memory
len(s) = 6
cap(s) = 6
接下来我们说:让这个slice'slen为0,这就是在位置0s = s[:0]处取一个长度为0的子切片。s注意s[0:0]是一样的,你可以省略第一个0。
[0][1][2][3][4][5]
^
s still points to the start of the memory
len(s) = 0
cap(s) = 6
由于容量仍然相同,我们不妨将长度设为 4 s = s[:4]。
* * * *
[0][1][2][3][4][5]
^
s still points to the start of the memory
len(s) = 4
cap(s) = 6
然后我们通过做一个不在内存开头的子切片s = s[2:]。
* *
[0][1][2][3][4][5]
^
s now points to the original address plus two!
len(s) = 2
cap(s) = 4
TA贡献1807条经验 获得超9个赞
这是帮助我更好地理解这个概念的片段:
切片是数组段的描述符。它由指向数组的指针、段的长度及其容量(段的最大长度)组成。
切片不能超出其容量。尝试这样做会导致运行时恐慌,就像索引超出切片或数组边界时一样。同样,不能将切片重新切片到零以下以访问数组中较早的元素。
如果数组中有更多元素,则可以扩展切片,但它不能访问切片 0 以下的元素。它是底层数组的窗口
- 2 回答
- 0 关注
- 91 浏览
添加回答
举报