如何在Go中使用运行时大小分配数组?
以下代码是非法的:
n := 1
var a [n]int
你收到消息prog.go:12: invalid array bound n
(或类似的),但这样可以正常工作:
const n = 1
var a [n]int
问题是,在运行时之前,我可能不知道我想要的数组的大小。
(顺便说一下,我首先在问题How to implement resizable arrays in Go中查找答案,但这是一个不同的问题。)
答案 0 :(得分:19)
答案是您不直接分配 数组 ,在创建 时,Go会为您分配一个 片 强>
内置函数make([]T, length, capacity)
创建一个切片及其后面的数组,并且{{1}的值没有(愚蠢的)编译时常量限制}和length
。正如它在Go language specification中所说的那样:
使用
capacity
创建的切片始终会分配返回切片值所引用的新隐藏数组。
所以我们可以写:
make
并且分配了一个大小为 n := 12
s := make([]int, n, 2*n)
的数组,其中2*n
切片初始化为它的前半部分。
我不确定Go为什么不直接分配数组s
,因为你可以间接地做,但答案很明确:“在Go中,使用切片而不是数组(大部分时间。)“