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

时间:2017-11-13 02:00:16

标签: go

https://tour.golang.org/moretypes/11

在本教程中,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不再是数组而是切片?如何将此切片再次分配给实际上具有内容的不同长度?

1 个答案:

答案 0 :(得分:5)

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

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

创建一个包含内容的数组:2,3,5,7,11,13,切片s指向该数组,只要数组本身就可以。

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

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

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

[2 3 5 7 11 13]
[]2 3 5 7 11 13
[2 3 5 7] 11 13

但阵列总是保持不变。

作为注释,因为切片不会创建新数组,即使将每个切片保存在不同的变量中,底层数组也是相同的,因此如果修改一个切片中的一个元素,你会在共享同一个数组的所有切片中看到相同的变化。