go关于切片的问题

sukha 3 min read

Q: 我有一个疑惑的地方,为什么x的切片x[:cap (x)]可以比x的元素更多,我觉得有点奇怪

A: 你的疑惑在于:把 x 理解成了“只有两个位置的容器”。实际上,x 是底层数组的一段视图,底层数组可能更大。

比如:

go
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 个元素。

执行:

go
all := x[:cap(x)]

就是基于同一个底层数组,创建一个范围更大的切片:

底层数组: [10, 20, 0, 0]
x 的范围: [10, 20]
all 的范围: [10, 20, 0, 0]

额外的两个位置本来就存在,因此这里没有新增或复制元素,只是让 all 把它们也包含进来。x 本身的长度仍然是 2。

Go 对这两种操作的限制不同:

go
x[2] // 越界:访问元素,下标必须小于 len(x)
x[:4] // 合法:重新切片,上界可以到 cap(x)

len 限制当前能直接访问的元素,cap 限制重新切片时能扩展到哪里。

后记

My avatar

感谢你读到这里。

这座小站更像一份持续维护的“终端笔记”:记录我解决问题的过程,也记录走过的弯路。


More Posts

评论

评论 (0)

请先登录后再发表评论

加载中...