一尘不染

如何在Go中分配非恒定大小的数组

go

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

以下代码是非法的:

 n := 1
 var a [n]int

您会收到消息prog.go:12: invalid array bound n(或类似消息),但是效果很好:

 const n = 1
 var a [n]int

问题是,我可能要等到运行时才能知道我想要的数组的大小。


阅读 193

收藏
2020-07-02

共1个答案

一尘不染

答案是您不直接分配一个 数组 ,而是 在创建 slice 让Go为您分配一个 数组

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

使用创建的切片make始终分配一个新的隐藏数组,返回的切片值将引用该数组。

所以我们可以这样写:

 n := 12
 s := make([]int, n, 2*n)

并为数组分配了size 2*n,并将s切片初始化为它的前半部分。

我不确定为什么Go不能[n]int直接分配数组,因为您可以间接进行分配,但是答案很明确:“ 在Go中,多数时候使用切片而不是数组。

2020-07-02