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

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 How to implement resizable arrays in Go for an answer, but that is a different question.)

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)."