Как добавить элементы в слайс и что при этом происходит с его емкостью (capacity)?

Ответ

В Go для добавления элементов в слайс используется встроенная функция append(). Она добавляет один или несколько элементов в конец слайса и возвращает новый слайс.

Если в базовом массиве, на который указывает слайс, достаточно места (т.е. len < cap), новый элемент будет добавлен в этот же массив. Если места недостаточно, append создаст новый массив с увеличенной емкостью, скопирует в него все старые элементы и добавит новые.

Пример:

// Создаем слайс с длиной 3 и емкостью 3
s := []int{1, 2, 3}

// Добавляем один элемент. Емкости не хватает, создается новый массив.
s = append(s, 4) // s: [1, 2, 3, 4]

// Добавляем еще два элемента.
s = append(s, 5, 6) // s: [1, 2, 3, 4, 5, 6]

Ключевые моменты:


  1. Всегда присваивайте результат append обратно в переменную. Так как append может вернуть как указатель на старый массив, так и на совершенно новый, необходимо всегда обновлять переменную слайса:

    s = append(s, ...) // Правильно

    append(s, ...) // Неправильно, результат может быть утерян



  2. Объединение двух слайсов выполняется с помощью оператора ...:



    first := []int{1, 2}
    second := []int{3, 4}

// Добавляем все элементы 'second' в 'first'
first = append(first, second...) // first: [1, 2, 3, 4]