考虑以下代码
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
使用slice变量调用简单的Println会更改其容量。我怀疑调用带有可变参数的任何函数都会...interface{}产生相同的效果。对于这种行为是否有任何理智的解释?
...interface{}
解释是,就像github中的 bradfitz point 一样,如果您不使用它来创建切片,则编译器将使用它认为方便的上限。 创建具有不同版本甚至相同版本的多个片可能会导致具有不同容量的片。make
make
简而言之,如果您需要具体的功能,请使用make([]byte, len, cap)。否则,您将无法信任固定的容量。
make([]byte, len, cap)