为了账号安全,请及时绑定邮箱和手机立即绑定

为什么切片的容量会发生变化?难道不应该是一样的吗?

为什么切片的容量会发生变化?难道不应该是一样的吗?

Go
阿晨1998 2022-08-01 10:54:48
我是新手,这个例子让我感到困惑:import "fmt"func main() {    s := []int{2, 3, 5, 7, 11, 13}    printSlice(s)    // Slice the slice to give it zero length.    s = s[:0]    printSlice(s)    // Extend its length.    s = s[:4]    printSlice(s)    // Drop its first two values.    s = s[2:]    printSlice(s)}func printSlice(s []int) {    fmt.Printf("len=%d cap=%d %v\n", len(s), cap(s), s)}输出:len=6 cap=6 [2 3 5 7 11 13]len=0 cap=6 []len=4 cap=6 [2 3 5 7]len=2 cap=4 [5 7]为什么上一个容量变为4?根据定义,容量是基础数组的长度。
查看完整描述

2 回答

?
当年话下

TA贡献1890条经验 获得超9个赞

Slice 建立在数组上,它由指向数组的指针、段的长度及其容量(段的最大长度)组成。

关键点是 ,而不是 .segmentarray

    s = s[2:]

当您删除前两个值时,从第三个元素开始,成为指向数组另一半段的切片,因此它的上限为 。s4

就像你不能做一个指向数组的前一部分,那部分不能算进去。s[-1]cap

编号: https://blog.golang.org/slices-intro


查看完整回答
反对 回复 2022-08-01
?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

切片的容量是基础数组中的元素数,从切片中的第一个元素开始计算。

在您的示例中,在最后一种情况下,切片的起始元素为 5,在基础 arrray({2, 3, 5, 7, 11, 13})中,5 的 poistion 为 2。要计算容量,应从索引 2 开始计数。如果您从该位置计数,您将获得正确的容量 4


查看完整回答
反对 回复 2022-08-01
  • 2 回答
  • 0 关注
  • 133 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号