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

Ste*_*ell 14 arrays go

如何在Go中使用运行时大小分配数组?

以下代码是非法的:

 n := 1
 var a [n]int
Run Code Online (Sandbox Code Playgroud)

你得到消息prog.go:12: invalid array bound n(或类似的),而这工作正常:

 const n = 1
 var a [n]int
Run Code Online (Sandbox Code Playgroud)

麻烦的是,我可能不知道我想要的数组的大小,直到运行时.

(顺便说一句,我首先查看了如何在Go中实现可调整大小的数组以获得答案的问题,但这是一个不同的问题.)

Ste*_*ell 19

答案是你不直接分配一个数组,你在创建一个 切片让Go为你分配一个.

内置的函数make([]T, length, capacity)创建了一个切片和它后面的阵列,并且没有(傻)上的值编译时间常数-限制性lengthcapacity.正如它在Go语言规范中所说:

创建的切片make始终会分配返回切片值所引用的新隐藏数组.

所以我们可以写:

 n := 12
 s := make([]int, n, 2*n)
Run Code Online (Sandbox Code Playgroud)

并且已经为数组分配了大小2*n,并将s切片初始化为它的前半部分.

我不确定为什么Go不会[n]int直接分配数组,因为你可以间接地进行,但答案很明确:" 在Go中,使用切片而不是数组(大部分时间). "

  • 即使反射包似乎也不允许分配动态大小的数组.我怀疑这与类型系统有关,因为数组大小是类型的一部分,因此动态大小需要动态生成新类型ID. (2认同)