https://tour.golang.org/moretypes/11
在本教程中,s首先分配给
s := []int{2, 3, 5, 7, 11, 13}
Run Code Online (Sandbox Code Playgroud)
然后在那之后做了一系列的动作 s
s = s[:0]
printSlice(s) // len=0 cap=6 []
s = s[:4]
printSlice(s) // len=4 cap=6 [2 3 5 7]
Run Code Online (Sandbox Code Playgroud)
我通常在python中编码,所以这让我有点困惑.在分配时s=s[:0],不s应该更改为原始切片s,这意味着s不再是数组而是切片?如何将此切片再次分配给实际上具有内容的不同长度?
go中的切片是一个位于数组顶部的奇特结构.在你的例子中:
s := []int{2, 3, 5, 7, 11, 13}
Run Code Online (Sandbox Code Playgroud)
创建一个包含内容的数组: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
Run Code Online (Sandbox Code Playgroud)
但阵列始终保持不变.
请注意,因为切片不会创建新数组,即使您将每个切片保存在不同的变量中,底层数组也是相同的,因此如果您修改一个切片中的一个元素,您会看到共享相同阵列的所有切片中的相同更改.
| 归档时间: |
|
| 查看次数: |
1380 次 |
| 最近记录: |