Алгоритм увеличения слайса?

Middle
884 просмотров
AFK Offer AI

Когда 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) — избежишь лишних аллокаций и копирований.

Следующий вопрос

Как работает cross-compilation в Go?