Take the 2-minute tour ×

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

share|improve this question

1 Answer 1

up vote 4 down vote accepted

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

share|improve this answer
Even the reflection package doesn't seem to permit allocating dynamic-sized arrays. I suspect this is related to the type system, since the array size is part of the type, so dynamic sizes would require dynamically generating new type IDs. –  Evan Apr 25 at 12:05
@Evan Yes, though I avoid using dynamic to describe this. Strictly speaking the array size isn't dynamic: once it is created the array size is fixed. I suppose this is related to the fact that you can't get at the array behind a slice. If you could you could look at its type and this would have to be generated anew. It makes some sort of sense. –  Steve Powell Apr 25 at 13:04
I have accepted my own answer since it appears to be correct. –  Steve Powell May 9 at 13:05

Your Answer


