Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Go切片长度是容量-1,为什么?_Arrays_Go_Slice - Fatal编程技术网

Arrays Go切片长度是容量-1,为什么?

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

考虑下面的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,为什么:

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个元素。看看我的答案。