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
不再是数组而是切片?如何将此切片再次分配给实际上具有内容的不同长度?
答案 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
但阵列总是保持不变。
作为注释,因为切片不会创建新数组,即使将每个切片保存在不同的变量中,底层数组也是相同的,因此如果修改一个切片中的一个元素,你会在共享同一个数组的所有切片中看到相同的变化。