如何在 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 中寻找答案,但这是一个不同的问题。)
最佳答案
答案是你不直接分配一个数组,你可以在创建一个时让Go为你分配一个 slice 。
内置函数make([]T, length, capacity)
创建一个 slice 和它后面的数组,而且没有(傻)编译—— length
和 capacity
值的时间常数限制。正如 Go language specification 中所说:
A slice created with
make
always allocates a new, hidden array to which the returned slice value refers.
所以我们可以这样写:
n := 12
s := make([]int, n, 2*n)
并分配一个大小为 2*n
的数组,其中 s
slice 初始化为它的前半部分。
我不确定为什么 Go 不直接分配数组 [n]int
,因为你可以间接地做到这一点,但答案很明确:“在 Go 中,使用 slice 而不是数组(大部分时间)。"
关于arrays - 如何在 Go 中分配非常量大小的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23290858/