go - Println 改变 slice 的容量

标签 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{} 的可变参数调用任何函数都会产生相同的效果。对这种行为有什么合理的解释吗?

最佳答案

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

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

关于go - Println 改变 slice 的容量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49951924/

相关文章:

csv - 如何对 CSV 文件重新排序以按特定列的内容进行分组

Go 模块与包

go - 两个排序数组中第 k 个最高的

go - 无法从 Postman 中的 Get Url 获取对象 ID

github - golang 中非原子类型的类型包装

go - 如何进行短/相对导入

pointers - 如何共享嵌入的结构指针

algorithm - 实时显示一段时间内最常见/重复的元素

go - 使用 `go doc` 命令查看示例函数?

logging - Go:文件错误记录中的新行