Когда capacity слайса не хватает для append, Go выделяет новый массив и копирует данные. Алгоритм роста (Go 1.18+):
- Если cap < 256: удваивается (newcap = oldcap * 2)
- Если cap >= 256: растёт на ~25% с плавным переходом:
newcap = oldcap + oldcap/4 + 192
s := make([]int, 0)
for i := 0; i < 10; i++ {
s = append(s, i)
fmt.Printf("len=%d cap=%d\n", len(s), cap(s))
}
// cap: 1, 2, 4, 8, 8, 8, 8, 8, 16, 16
Важно: при известном размере заранее выделяй capacity через make([]T, 0, size) — избежишь лишних аллокаций и копирований.