Skip to content

Емкость слайса (capacity)

Пришло время поговорить о ещё одном компоненте заголовка слайса — его емкости. Помимо указателя массива и длины, заголовок слайса также хранит его емкость, Cap.

Посмотри на следующую функцию, которая расширяет часть своего аргумента слайса из числового типа int на один элемент.

Почему функция должна возвращать сам слайс?

Самое время протестировать код!

Посмотрим, как слайс растет до тех пор, пока не перестанет расти.

Поле Cap (capacity — емкость) хранит значение, сколько памяти выделено под базовый массив; это максимальное значение поля Len (length — длина) текущего количества элементов в слайсе. Попытка увеличить срез за пределы его емкости приведет к выходу за пределы массива и вызовет панику.

После того, как наш пример среза создан следующим образом slice :\= iBuffer [ 0:0 ]

Slice header будет выглядеть так, как указано на скриншоте.

Самое время протестировать код!

Внимание! len и cap указывают на количество элементов, len — текущее количество элементов, cap — количество элементов, под которое выделена память. Также не стоит забывать, что отсчет индекса элементов в массиве начинается с нулевого элемента.

Самое время протестировать код!

То есть максимальный index в слайсах и массивах равен len(s)-1.

Самое время протестировать код!

На строке 7 в качестве индекса мы используем длину массива минус один, так как отсчет индекса массива начинается с нулевого элемента. То есть при длине слайса, равной 8 максимальный индекс массива будет равен 7 (len(s)-1).

Если ты хочешь узнать параметры слайса, используй функцию len(s) для получения длины слайса и функцию cap(s) для получения текущей емкости слайса.

Самое время протестировать код!