append добавляет элементы в слайс. Если capacity хватает — пишет в существующий underlying array. Если нет — аллоцирует новый массив (обычно x2 для маленьких слайсов, x1.25 для больших) и копирует данные.
s := make([]int, 0, 2)
s = append(s, 1, 2) // len=2, cap=2, без аллокации
s = append(s, 3) // len=3, cap=4, новый массив
Важно: всегда присваивай результат обратно: s = append(s, ...). Иначе можешь потерять ссылку на новый массив.
Ловушка: если два слайса делят один underlying array, append в один может перезаписать данные другого:
a := []int{1, 2, 3, 4}
b := a[:2] // b = [1,2], но cap=4
b = append(b, 99) // a теперь [1,2,99,4] — сюрприз!