Ответ
Нет, при укорачивании слайса с конца (например, slice = slice[:n]
) его capacity
не меняется.
Почему так происходит?
capacity
слайса вычисляется от его начального элемента до конца базового массива. Когда мы укорачиваем слайс, мы просто уменьшаем его len
, но начало и конец базового массива остаются на своих местах. Указатель на начало слайса также не меняется.
Пример 1: Укорачивание с конца
s := make([]int, 5, 10) // len=5, cap=10
// s -> [0,0,0,0,0]
s = s[:3] // Уменьшаем длину до 3
// len=3, cap=10 (capacity осталась прежней)
// s -> [0,0,0]
Важное дополнение: capacity
уменьшится, если сделать срез, который сдвигает начало слайса.
Пример 2: Срез с начала
s := make([]int, 5, 10) // len=5, cap=10
s = s[2:] // Сдвигаем начало слайса на 2 элемента вправо
// len=3 (5-2), cap=8 (10-2)
// Новый слайс потерял доступ к первым двум элементам базового массива,
// поэтому его ёмкость уменьшилась.
Чтобы гарантированно уменьшить capacity
и освободить память, нужно скопировать нужные данные в новый слайс меньшего размера.