Назад к вопросам
Middle
115
questionbank
Насколько увеличивается размер слайса при использовании функции append?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Размер слайса может увеличиваться по-разному в зависимости от текущей вместимости cap(slice):
- Если недостаточно вместимости: Новая вместимость будет как минимум в 2 раза больше текущей вместимости, если текущая вместимость меньше 1024. Если больше 1024, новая вместимость будет увеличиваться на 25% от текущей вместимости, пока не станет достаточной. Затем она может быть выровнена вверх.
- Если достаточно вместимости: Размер слайса увеличивается ровно на количество добавленных элементов, а вместимость не меняется.
// Пример поведения 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% после) сохраняются.