В Go документах, cap - это длина базового массива, почему его значение не равно 6?
Поскольку емкость равна , а не размер базового массива (могут быть особые случаи, когда они равны, но в целом они не равны). Когда срез создается путем нарезки резервного массива, используя 0
для низкого индекса (или опуская его) и длину массива для высокого индекса (или опуская его), тогда да, емкость будет равна массиву длина.
Спецификация: длина и вместимость:
Емкость слайса - это количество элементов, для которых есть место, выделенное в базовом массиве.
Таким образом, емкость начинается с первого элемента среза, и если он не совпадает с первым элементом резервного массива, они не будут равны. Об этом прямо говорится на странице Tour , на которую вы ссылаетесь:
Емкость слайса - это количество элементов в базовом массиве, считая от первого элемента в слайсе .
Существует также полное выражение среза , которое имеет вид:
a[low : high : max]
Там, где вы можете контролировать емкость результирующего среза, вы можете ограничить, насколько дальнейшее срезание может расширить срез. Индекс max
может указывать на элемент перед последним элементом массива.
См. Этот пример:
a := [10]int{}
s := a[:] // len=10, cap=10
fmt.Printf("len=%d, cap=%d\n", len(s), cap(s))
s = a[2:] // len=8, cap=8
fmt.Printf("len=%d, cap=%d\n", len(s), cap(s))
s = a[2:7] // len=5, cap=8
fmt.Printf("len=%d, cap=%d\n", len(s), cap(s))
s = a[2:7:8] // len=5, cap=6
fmt.Printf("len=%d, cap=%d\n", len(s), cap(s))
Выходы (попробуйте на Go Playground ):
len=10, cap=10
len=8, cap=8
len=5, cap=8
len=5, cap=6