Можно ли добавить элемент в массив (array) в Go и в чем отличие от слайса (slice)?

Ответ

Этот вопрос затрагивает ключевое различие между массивами и слайсами в Go.

Массив (Array)

Нет, в массив нельзя добавить новый элемент. Массив в Go — это структура данных с фиксированным размером, который определяется на этапе компиляции. Размер является частью типа массива ([3]int и [4]int — это два разных, несовместимых типа).

Вы можете только изменять значения существующих элементов по индексу.

var arr [3]int // Массив на 3 элемента
arr[0] = 10
// arr[3] = 40 // Ошибка компиляции: invalid array index 3 (out of bounds for 3-element array)
// arr = append(arr, 40) // Ошибка компиляции: append не применим к массивам

Слайс (Slice)

Да, в слайс можно добавлять элементы с помощью встроенной функции append. Слайс — это динамическая структура, которая представляет собой "вид" или "ссылку" на участок нижележащего массива. Слайс имеет длину (len) и ёмкость (cap).

Сложность добавления в слайс — амортизированная O(1), как описано в другом вопросе.

var slc []int // Слайс, изначально nil
slc = append(slc, 10) // OK
slc = append(slc, 20) // OK
slc = append(slc, 30) // OK
slc = append(slc, 40) // OK, при необходимости произойдет реаллокация

Итог: Вопрос о "добавлении элемента в конец" корректен только для слайсов. Для массивов такая операция невозможна из-за их фиксированного размера.