如何在Go中分配一个非常量大小的数组

时间:2014-04-25 10:45:26

标签: arrays go

如何在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中查找答案,但这是一个不同的问题。)

1 个答案:

答案 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中,使用切片而不是数组(大部分时间。)