Назад к вопросам
Middle
115
questionbank

Насколько увеличивается размер слайса при использовании функции append?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Размер слайса может увеличиваться по-разному в зависимости от текущей вместимости cap(slice):

  1. Если недостаточно вместимости: Новая вместимость будет как минимум в 2 раза больше текущей вместимости, если текущая вместимость меньше 1024. Если больше 1024, новая вместимость будет увеличиваться на 25% от текущей вместимости, пока не станет достаточной. Затем она может быть выровнена вверх.
  2. Если достаточно вместимости: Размер слайса увеличивается ровно на количество добавленных элементов, а вместимость не меняется.
// Пример поведения append при нехватке вместимости
s := make([]int, 0, 0) // size 0, cap 0
s = append(s, 1)       // size 1, cap 1. (0 -> 1)
s = append(s, 2)       // size 2, cap 2. (1 -> 2)
s = append(s, 3)       // size 3, cap 4. (2 -> 4)
s = append(s, 4)       // size 4, cap 4
s = append(s, 5)       // size 5, cap 8. (4 -> 8)

s2 := make([]int, 0, 1025) // size 0, cap 1025
s2 = append(s2, make([]int, 500)...) // size 500, cap 1025 (вместимости хватает)
s2 = append(s2, make([]int, 1000)...) // size 1500, cap примерно 1025 + 1025*0.25 + epsilon

Конкретный алгоритм роста вместимости находится внутри runtime и может меняться между версиями Go. Однако общие правила (удвоение до 1024, увеличение на ~25% после) сохраняются.