标准答案
- 两个 slice 可能共享底层数组,修改重叠范围会互相可见。
- append 未超过 cap 时通常复用数组,超过时可能分配新数组并复制数据。
- 切片大数组的一小段可能使整个数组继续存活,必要时复制需要的部分。
- 并发访问共享底层数组仍需同步,slice 本身不是并发容器。
题目解析
slice 由指针、len 和 cap 组成,传值只复制这三个描述字段,多个 slice 可能共享底层数组。共享范围内的修改会互相可见,append 是否复用数组取决于剩余容量。
append 超过 cap 时会分配新数组,未超过时可能修改原数组;调用方不能在不了解容量的情况下假设两个 slice 独立。需要隔离时使用 copy。
从大 buffer 切出的小 slice 仍可能让整个底层数组存活。文件、网络和缓存场景要控制引用生命周期,并对共享 slice 的并发读写加同步。
常见误区
- 误区:返回 slice 就一定复制数据。改正:明确所有权,必要时用 copy 创建独立存储。
- 误区:append 后假设旧 slice 与新 slice 独立。改正:理解 cap 和底层数组,避免共享数据的隐式修改。
- 误区:长期保存大 buffer 的小 slice。改正:复制需要的部分,释放对大底层数组的引用。