Arrays Go切片长度是容量-1,为什么?
考虑下面的go代码:Arrays Go切片长度是容量-1,为什么?,arrays,go,slice,Arrays,Go,Slice,考虑下面的go代码: fruits := [4]string{"apple", "orange", "mango"} tasty_fruits := fruits[1:3] fmt.Println(len(tasty_fruits)) fmt.Println(cap(tasty_fruits)) fmt.Println(tasty_fruits) 输出: 2 3 [orange mango] 我不明白的是,为什么美味水果的容量是3,直觉上我认为是2,因为那是切片的长度 如果美味水果的容量为3
fruits := [4]string{"apple", "orange", "mango"}
tasty_fruits := fruits[1:3]
fmt.Println(len(tasty_fruits))
fmt.Println(cap(tasty_fruits))
fmt.Println(tasty_fruits)
输出:
2
3
[orange mango]
我不明白的是,为什么美味水果的容量是3,直觉上我认为是2,因为那是切片的长度
如果美味水果的容量为3,为什么:
tasty_fruits[2] = "nectarine"
结果:
panic: runtime error: index out of range
这一行:
fruits := [4]string{"apple", "orange", "mango"}
创建数组,而不是切片。它有4个元素,尽管您只提供了3个。fmt.Printf的输出(“%q”,水果)
:
切片:
tasty_fruits := fruits[1:3]
结果:
["orange" "mango"]
长度:显然是2。容量
容量是。。。切片长度与切片之外的[基础]数组长度之和
由于基础数组中的“mango”
后面有一个元素,因此容量为2+1=3
为切片编制索引(美味水果
):规格:
对于切片类型S
的a
:a[x]
- 如果运行时
超出范围,则会发生运行时死机x
x
在范围内,如果0此行:
fruits := [4]string{"apple", "orange", "mango"}
创建数组,而不是切片。它有4个元素,尽管您只提供了3个。fmt.Printf的输出(“%q”,水果)
:
切片:
tasty_fruits := fruits[1:3]
结果:
["orange" "mango"]
长度:显然是2。容量
容量是。。。切片长度与切片之外的[基础]数组长度之和
由于基础数组中的“mango”
后面有一个元素,因此容量为2+1=3
为切片编制索引(美味水果
):规格:
对于切片类型S
的a
:a[x]
- 如果运行时
x
超出范围,则会发生运行时死机
x
在范围内,如果0您正在创建容量为3的切片(因为[1:3]可以包含3个元素:1、2和3)。但由于要从中复制的切片不包含3上的元素,因此仅复制1和2 您正在创建一个容量为3的切片(因为[1:3]可以包含3个元素:1、2和3)。但由于要从中复制的切片不包含3上的元素,因此仅复制1和2 片的容量取决于底层数组的大小。
因此,如果将水果更改为不同的大小,例如:
fruits := [5]string{"apple", "orange", "mango"}
cap(美味水果)将返回4而不是3
因此,容量意味着片的最大大小可以扩展到。“无法将切片扩展到超出其容量。尝试这样做将导致运行时恐慌”
切片本质上是带有边界检查的c
指针。切片的长度是它将在运行时检查的边界。因此,如果您试图访问长度以外的任何内容,也会导致运行时恐慌
是的,长度切片的容量取决于底层数组的大小。
因此,如果将水果更改为不同的大小,例如:
fruits := [5]string{"apple", "orange", "mango"}
cap(美味水果)将返回4而不是3
因此,容量意味着片的最大大小可以扩展到。“无法将切片扩展到超出其容量。尝试这样做将导致运行时恐慌”
切片本质上是带有边界检查的c
指针。切片的长度是它将在运行时检查的边界。因此,如果您试图访问长度以外的任何内容,也会导致运行时恐慌
yes length如本文所述:“容量字段记录基础阵列实际拥有的空间量;它是长度可以达到的最大值。尝试将切片扩展到超出其容量将超出阵列的限制,并将触发恐慌。”如本文所述:“容量字段记录基础阵列的实际空间大小;这是长度可以达到的最大值。试图将切片扩展到超出其容量将超出阵列的限制,并将引发恐慌。“我推荐等级库:,和。我推荐等级库:,和。切片不会复制元素。源是一个数组,不是一个切片,数组有4个元素。请参阅我的答案。切片不会复制元素。源是一个数组,不是一个切片,数组有4个元素。看看我的答案。