Как выделить массив не постоянного размера в Go

Как вы распределяете массив в Go с размером времени выполнения?

Следующий код является незаконным:

 n := 1
 var a [n]int

вы получите сообщение prog.go:12: invalid array bound n (или подобное), тогда как это отлично работает:

 const n = 1
 var a [n]int

Проблема в том, что я могу не знать размер массива, который я хочу, до выполнения.

(Кстати, я сначала рассмотрел вопрос Как реализовать изменчивые массивы в Go для ответа, но это другой вопрос.)

Ответ 1

Ответ заключается в том, что вы не выделяете массив напрямую, вы получаете Go, чтобы выделить его для создания среза.

Встроенная функция make([]T, length, capacity) создает срез и массив позади него, и нет (глупо) ограничение времени компиляции-времени на значения length и capacity. Как говорится в спецификации Go language:

Слайд, созданный с помощью make, всегда выделяет новый скрытый массив, к которому относится возвращаемое значение среза.

Итак, мы можем написать:

 n := 12
 s := make([]int, n, 2*n)

и имеет размер, выделенный массивом 2*n, с s срез, инициализированный как первая половина.

Я не уверен, почему Go не выделяет массив [n]int напрямую, учитывая, что вы можете сделать это косвенно, но ответ ясен: "В Go используйте срезы, а не массивы (большую часть времени)."