切片容量

时间:2018-10-04 13:23:37

标签: go

我是Golang的新手,我正在参加巡回赛。下面的代码产生以下结果:

a len = 5 cap = 5 [0 0 0 0 0]

b len = 0 cap = 5 []

c len = 2 cap = 5 [0 0]

d len = 3 cap = 3 [0 0 0]

在完全不指定c的情况下,c如何与b具有相同的上限?

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)
}

1 个答案:

答案 0 :(得分:2)

每个切片都是指向基础数组的指针类型。使b时,将创建b指向的基础数组。通过限制b创建c时,将创建一个新切片,该切片指向与b相同的基础数组。

在b中更改某些条目时,您会注意到在c中这些值也被更改。

有一个官方博客条目,详细解释了所有这些内容:https://blog.golang.org/go-slices-usage-and-internals