我最近学习了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容量为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] ```