如何在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)创建了一个切片和它后面的阵列,并且没有(傻)上的值编译时间常数-限制性length和capacity.正如它在Go语言规范中所说:
创建的切片
make始终会分配返回切片值所引用的新隐藏数组.
所以我们可以写:
n := 12
s := make([]int, n, 2*n)
Run Code Online (Sandbox Code Playgroud)
并且已经为数组分配了大小2*n,并将s切片初始化为它的前半部分.
我不确定为什么Go不会[n]int直接分配数组,因为你可以间接地进行,但答案很明确:" 在Go中,使用切片而不是数组(大部分时间). "