golang切片变量赋值(来自教程)

golang切片变量赋值(来自教程),go,Go,在本教程中,s首先分配给 s := []int{2, 3, 5, 7, 11, 13} 然后,对s s = s[:0] printSlice(s) // len=0 cap=6 [] s = s[:4] printSlice(s) // len=4 cap=6 [2 3 5 7] 我通常用python编写代码,所以这让我有点困惑。分配s=s[:0]时,是否应将s更改为原始s的切片,这意味着s不再是数组而是切片?如何将此切片再次分配给实际包含内容的不同长度?go中的切片是一种位于数组顶部的奇

在本教程中,
s
首先分配给

s := []int{2, 3, 5, 7, 11, 13}
然后,对
s

s = s[:0]
printSlice(s)  // len=0 cap=6 []
s = s[:4]
printSlice(s) // len=4 cap=6 [2 3 5 7]

我通常用python编写代码,所以这让我有点困惑。分配
s=s[:0]
时,是否应将
s
更改为原始
s
的切片,这意味着
s
不再是数组而是切片?如何将此切片再次分配给实际包含内容的不同长度?

go中的切片是一种位于数组顶部的奇特结构。在您的示例中:

s := []int{2, 3, 5, 7, 11, 13}
[2 3 5 7 11 13]
[]2 3 5 7 11 13
[2 3 5 7] 11 13
创建一个包含以下内容的数组:2、3、5、7、11、13,切片
s
指向该数组,它与数组本身一样长

当切片
s=s[:0]
时,将在同一数组上创建长度为0的新切片。尽管新切片是空的,因为当您使用
s=s[:4]
将切片变大时,它共享相同的数组,因此它允许您查看数组的前4个值

切片就像是底层数组中的窗口,修改切片不会修改数组。因此,第一个片段让您看到数组中的所有元素,第二个片段不显示任何元素,第三个片段让您只看到前4个元素

在这里,我使用
[]
来表示示例每个部分中的切片
a
内容:

s := []int{2, 3, 5, 7, 11, 13}
[2 3 5 7 11 13]
[]2 3 5 7 11 13
[2 3 5 7] 11 13
但数组始终保持不变


需要注意的是,由于切片不会创建新的数组,即使您将每个切片保存在不同的变量中,底层数组也是相同的,因此,如果您修改一个切片中的一个元素,您将在共享同一数组的所有切片中看到相同的更改。

阅读本文以了解切片的工作原理:因此,如果我修改该值(比如,
s[1]=10
),我应该会看到数组本身的变化?意思是现在数组看起来像
[2,10,5,7,11,13]
?没错。看看我举的这个小例子: