go关于切片的问题
sukha 3 min read
Q: 我有一个疑惑的地方,为什么x的切片x[:cap (x)]可以比x的元素更多,我觉得有点奇怪
A: 你的疑惑在于:把 x 理解成了“只有两个位置的容器”。实际上,x 是底层数组的一段视图,底层数组可能更大。
比如:
x := make([]int, 2, 4)x[0], x[1] = 10, 20这里实际创建了一个有 4 个位置的底层数组,只是 x 当前只包含前两个位置:
下标: 0 1 2 3底层数组: [10, 20, 0, 0]x 的范围: [10, 20]所以:
len(x) = 2:当前切片包含 2 个元素。cap(x) = 4:从当前起点开始,可以把切片扩展到 4 个元素。
执行:
all := x[:cap(x)]就是基于同一个底层数组,创建一个范围更大的切片:
底层数组: [10, 20, 0, 0]x 的范围: [10, 20]all 的范围: [10, 20, 0, 0]额外的两个位置本来就存在,因此这里没有新增或复制元素,只是让 all 把它们也包含进来。x 本身的长度仍然是 2。
Go 对这两种操作的限制不同:
x[2] // 越界:访问元素,下标必须小于 len(x)
x[:4] // 合法:重新切片,上界可以到 cap(x)len 限制当前能直接访问的元素,cap 限制重新切片时能扩展到哪里。
评论 (0)
请先登录后再发表评论