更改切片容量:删除第一个和最后一个项目之间的差异
在探索 Go 的切片功能时,出现了一个常见问题:为什么切片的删除前 n 个项目与删除最后 n 个项目时容量的行为有所不同?
要回答这个问题,了解 Go 切片的结构如下很重要:
type slice struct { array unsafe.Pointer len int cap int }
删除最后 n 个项目
从切片中删除最后 n 个项目时(例如,s = s[:len(s)-2]),切片的数据仍然存储在底层数组中。 len 字段被更新以反映切片的新长度,而 cap 字段保持不变。这将为切片保留相同的数组分配。
删除前 n 个项目
但是,当删除前 n 个项目时(例如 s = s[2: ]),切片的基础数据需要移动到同一数组的不同部分。这是因为前 n 个元素的原始内存位置不再有效。结果,使用不同的数组指针创建了一个新切片,同时调整 len 和 cap 字段。
为了说明这一点,让我们增强 printSlice 函数以显示指向底层数组的指针:
<code class="go">func printSlice(s []int) { var ptr *int if cap(s) >= 1 { ptr = &s[:cap(s)][0] } fmt.Printf("ptr=%p len=%d cap=%d %v\n", ptr, len(s), cap(s), s) }</code>
运行此修改后的代码演示了切片操作如何更改指针、长度和容量,从而确认上述行为。
以上是为什么删除第一个切片元素会改变容量,但删除最后一个元素却不会?的详细内容。更多信息请关注PHP中文网其他相关文章!