如何在 Go 中分配一个运行时大小的数组?
下面的代码是非法的:
n := 1
var a [n]int
当你看到类似 prog.go:12: invalid array bound n
的错误信息时,意味着有问题,与之相反,下面的代码运行正常:
const n = 1
var a [n]int
问题在于,我可能直到运行时才知道我想要的数组大小。
(顺便说一下,我首先在问题如何在Go中实现可调整大小的数组中寻找答案,但那是一个不同的问题。)
如何在 Go 中分配一个运行时大小的数组?
下面的代码是非法的:
n := 1
var a [n]int
当你看到类似 prog.go:12: invalid array bound n
的错误信息时,意味着有问题,与之相反,下面的代码运行正常:
const n = 1
var a [n]int
问题在于,我可能直到运行时才知道我想要的数组大小。
(顺便说一下,我首先在问题如何在Go中实现可调整大小的数组中寻找答案,但那是一个不同的问题。)
make([]T, length, capacity)
创建了一个切片和它背后的数组,并且对length
和capacity
的值没有(愚蠢的)编译时常量限制。正如Go语言规范中所说:使用
make
创建的切片总是会分配一个新的、隐藏的数组,返回的切片值指向该数组。
n := 12
s := make([]int, n, 2*n)
并且分配一个大小为2*n
的数组,使用s
作为初始为其前一半的切片。
我不确定为什么Go不直接分配[n]int
数组,因为你可以间接地实现它,但答案很清楚:“在大多数情况下,在Go中使用切片而不是数组。”