Ответ
При вызове append Go проверяет, достаточно ли capacity у слайса для добавления элементов. Если да, просто увеличивает len и копирует элементы в существующий массив. Если capacity недостаточно, создаётся новый массив (обычно с удвоенной capacity), копируются старые элементы, добавляются новые, и возвращается новый слайс.
Пример:
s := []int{1, 2}
s = append(s, 3) // Может изменить или создать новый массив
Важно:
- Возвращаемый слайс может указывать на новый массив
- При недостаточной capacity создаётся новый массив
- При малых размерах capacity растет в 2x, затем ~1.25x
- Если слайс создан из массива, append может его "оторвать"