一尘不染

Println更改切片的容量

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

使用slice变量调用简单的Println会更改其容量。我怀疑调用带有可变参数的任何函数都会...interface{}产生相同的效果。对于这种行为是否有任何理智的解释?


阅读 177

收藏
2020-07-02

共1个答案

一尘不染

解释是,就像github中的 bradfitz point
一样,如果您不使用它来创建切片,则编译器将使用它认为方便的上限。
创建具有不同版本甚至相同版本的多个片可能会导致具有不同容量的片。make


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

2020-07-02