Println改变切片的容量

时间:2018-04-21 02:50:49

标签: go

考虑以下代码

package main

import (
    "fmt"
)

func main() {
    x := []byte("a")
    fmt.Println(x)
    fmt.Println(cap(x) == cap([]byte("a"))) // prints false

    y := []byte("a")
    fmt.Println(cap(y) == cap([]byte("a"))) // prints true

}

https://play.golang.org/p/zv8KQekaxH8

使用切片变量调用简单的Println,更改其容量。我怀疑使用...interface{}的可变参数调用任何函数会产生相同的效果。对这种行为有什么明智的解释吗?

1 个答案:

答案 0 :(得分:8)

解释是,与github中的 bradfitz 一样,如果您不使用make创建切片,编译器将使用它认为的上限方便。 在不同版本中创建多个切片,甚至相同,可能会产生不同容量的切片。

简而言之,如果您需要具体的容量,请使用make([]byte, len, cap)。否则你无法信任固定容量。