如何在Go中分配运行时大小的数组?
以下代码是非法的:
n := 1 var a [n]int
您会收到消息prog.go:12: invalid array bound n(或类似消息),但是效果很好:
prog.go:12: invalid array bound n
const n = 1 var a [n]int
问题是,我可能要等到运行时才能知道我想要的数组的大小。
答案是您不直接分配一个 数组 ,而是 在创建 slice 时 让Go为您分配一个 数组 。
内置的函数make([]T, length, capacity)创建了一个切片 和它后面的阵列 ,并且没有(傻)上的值编译时间常数- 限制性length和capacity。正如Go语言规范中所说:
make([]T, length, capacity)
length
capacity
使用创建的切片make始终分配一个新的隐藏数组,返回的切片值将引用该数组。
make
所以我们可以这样写:
n := 12 s := make([]int, n, 2*n)
并为数组分配了size 2*n,并将s切片初始化为它的前半部分。
2*n
s
我不确定为什么Go不能[n]int直接分配数组,因为您可以间接进行分配,但是答案很明确:“ 在Go中,多数时候使用切片而不是数组。 ”
[n]int