Golang切片变量分配(来自教程)

5

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 不再是一个数组而是一个切片了?那么如何将这个切片重新分配到实际具有内容的不同长度上?

3
阅读此文章以理解切片的工作原理:https://blog.golang.org/go-slices-usage-and-internals - abhink
1个回答

8
在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

但是数组始终保持不变。

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


那么说,如果我修改了值(比如s[1] = 10),我应该能够在数组本身中看到变化,也就是说现在数组会变成[2, 10, 5, 7, 11, 13] - JChao
2
没错。看看我写的这个小例子:https://play.golang.org/p/T41T4f6GZf - Topo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接