Println改变切片的容量

vit*_*itr 5 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

}
Run Code Online (Sandbox Code Playgroud)

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

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

Iva*_*dad 8

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

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