英文:
How to allocate a non-constant sized array in Go
问题
在Go语言中,如果你想在运行时分配一个数组,可以使用切片(slice)来实现。切片是一个动态大小的数组,可以根据需要进行扩展或缩小。
下面是使用切片来分配数组的示例代码:
n := 1
a := make([]int, n)
这样就可以在运行时根据需要分配一个大小为n的数组。请注意,这里使用的是切片(slice)而不是数组(array)。
希望对你有帮助!如果你还有其他问题,请随时提问。
英文:
How do you allocate an array in Go with a run-time size?
The following code is illegal:
n := 1
var a [n]int
you get the message prog.go:12: invalid array bound n
(or similar), whereas this works fine:
const n = 1
var a [n]int
The trouble is, I might not know the size of the array I want until run-time.
(By the way, I first looked in the question https://stackoverflow.com/q/3387273/57171 for an answer, but that is a different question.)
答案1
得分: 22
答案是你不直接分配一个数组,而是在创建切片时让Go为你分配一个。
内置函数make([]T, length, capacity)
创建一个切片和其背后的数组,并且对length
和capacity
的值没有(愚蠢的)编译时常量限制。正如在Go语言规范中所说:
> 使用make
创建的切片总是会分配一个新的隐藏数组,返回的切片值指向该数组。
因此,我们可以这样写:
n := 12
s := make([]int, n, 2*n)
这样就会分配一个大小为2*n
的数组,并且s
是一个初始化为前半部分的切片。
我不确定为什么Go不直接分配[n]int
数组,因为你可以间接地做到,但答案很明确:“在Go中,大多数情况下使用切片而不是数组”。
英文:
The answer is you don't allocate an array directly, you get Go to allocate one for you when creating a slice.
The built-in function make([]T, length, capacity)
creates a slice and the array behind it, and there is no (silly) compile-time-constant-restriction on the values of length
and capacity
. As it says in the Go language specification:
> A slice created with make
always allocates a new, hidden array to which the returned slice value refers.
So we can write:
n := 12
s := make([]int, n, 2*n)
and have an array allocated size 2*n
, with s
a slice initialised to be the first half of it.
I'm not sure why Go doesn't allocate the array [n]int
directly, given that you can do it indirectly, but the answer is clear: "In Go, use slices rather than arrays (most of the time)."
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论