Ответ
При добавлении элементов в слайс, если capacity недостаточно, Go автоматически создает новый массив большего размера (обычно в 2 раза при len < 1024, иначе на ~25%) и копирует туда данные. Старый массив будет собран сборщиком мусора.
Пример:
s := make([]int, 0, 2) // len=0, cap=2
s = append(s, 1) // len=1, cap=2
s = append(s, 2) // len=2, cap=2
s = append(s, 3) // len=3, cap=4 (произошло расширение)
Важные моменты:
- Операция расширения дорогая (аллокация + копирование)
- При известном конечном размере лучше сразу указать capacity через make()
- После расширения новый слайс ссылается на другой массив