Golang 基本切片逻辑

Golang basic slice logic

我是 Golang 的新手,这让我很困惑:(来自 PHP 程序员)

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

然而,

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

为什么在已经被s[:3] & s[2:]切片的情况下,它仍然能够检索到原始s的剩余值?

创建切片时,会分配一个底层数组存储 来存储其元素。 切片操作不影响存储在底层数组中的值,它只是调整底层数组的视图范围以获得具有相同底层的不同视图的新切片数组.

如果底层数组的容量大于它的长度(可以访问的元素数)并且切片操作不超过容量(否则边界超出范围错误将发生)。

...
s = s[0:4]

对于上面的说法,

  • s[0] 指的是原始切片的第 2 个索引处的元素,即 5
  • s[1] 指的是原始切片的第 3 个索引处的元素,即 7
  • s[2] 指的是原始切片的第 4 个索引处的元素,即 11
  • s[3] 指的是原始切片的第 5 个索引处的元素,即 13