Меняется ли `capacity` слайса при его укорачивании с помощью операции среза?

Ответ

Нет, при укорачивании слайса с конца (например, 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 и освободить память, нужно скопировать нужные данные в новый слайс меньшего размера.