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