阵列 – 在高隆重新切片

我最近拿起了Go,现在我混淆了以下代码:

package main

import "fmt"

func main() {
    a := make([]int, 5)
    printSlice("a", a)
    b := make([]int, 0, 5)
    printSlice("b", b)
    c := b[:2]
    printSlice("c", c)
    d := c[2:5]
    printSlice("d", d)
}

func printSlice(s string, x []int) {
    fmt.Printf("%s len=%d cap=%d %v\n",
        s, len(x), cap(x), x)
}

结果:

a len=5 cap=5 [0 0 0 0 0]
b len=0 cap=5 []
c len=2 cap=5 [0 0] //why the capacity of c not 2 but 5 instead
d len=3 cap=3 [0 0 0]

任何帮助将谢谢。

c是从数组b取得的切片。这不是一个副本,而只是一个窗口b的b的第一个元素。

由于b的容量为5,c可以扩展到另外3个地方(实际上它会创建一个新的片段,但在内存中的同一个地方)。

切片的最大容量是底层阵列的容量减去阵列中切片开始位置:

 array : [0 0 0 0 0 0 0 0 0 0 0 0]
 array :  <----   capacity   --->
 slice :     [0 0 0 0]
 slice :      <---- capacity ---> 

也许这个程序会更清楚,c和d只是在b上的窗口:

func main() {
    b := make([]int, 0, 5)
    c := b[:2]
    d := c[1:5] // this is equivalent to d := b[1:5]
    d[0] = 1
    printSlice("c", c)
    printSlice("d", d)
}

输出:

c len=2 cap=5 [0 1] // modifying d has modified c
d len=4 cap=4 [1 0 0 0] 
翻译自:https://stackoverflow.com/questions/12768744/re-slicing-slices-in-golang

转载注明原文:阵列 – 在高隆重新切片