为什么这个切片在 Go 中改变它的容量?
在提到的“Go 之旅”幻灯片中,该片段包含以下操作整数切片。虽然切片的长度不断变化,但最后一行的容量似乎有所减少。此行为引发了有关切片容量可变性的问题。
容量从 6 更改为 4
切片的容量表示它可以容纳的槽数。最初,切片的容量为 6。当数据从切片末尾删除 (s = s[2:]) 时,容量保持不变,因为起始索引和后备数组末尾之间的距离不会改变。
但是,当切片的起始索引通过删除其前两个值 (s = s[2:]) 向前移动时,起始索引和后备数组末尾之间的距离会减小,从而导致容量减少为 4。这是因为切片现在占据数组的较小部分。
为什么只有最后一行更改其容量
容量仅在以下情况下更改切片的起始索引被修改。其他操作,例如将切片切片为零长度或扩展其长度,不会影响容量,因为它们不会更改起始索引。
切片头
为了更深入的理解,您可以使用反射打印切片的标题,这会显示其数据指针的变化。标头的 Data 字段指示后备数组中切片的起始索引,而 Cap 表示容量。
在最后一次调用中,Data 字段向前移动,随着起始索引之间的距离而减少容量并且支持阵列的末端减少。
以上是为什么在 Go 中切片有时会改变其容量?的详细内容。更多信息请关注PHP中文网其他相关文章!