21 Коллекции
Что лежит внутри slice?
Ответ
Три поля: указатель на первый элемент, len и cap. len — сколько элементов видно при индексе и в range. cap — сколько элементов помещается в текущем массиве, начиная с этого указателя. len никогда не больше cap.
Подробнее
Передача slice в функцию копирует заголовок, не элементы. Функция может заменить элементы по индексу, и это увидит вызывающий. Если функция делает append и не возвращает новый заголовок, вызывающий может остаться со старым len.
Выражение s[low:high] строит новый заголовок на том же массиве. Ёмкость такого среза — от low до конца исходной ёмкости.
package main
import "fmt"
func main() {
nums := make([]int, 3, 5)
nums[0], nums[1], nums[2] = 1, 2, 3
window := nums[1:3]
fmt.Println("nums", len(nums), cap(nums), nums)
fmt.Println("window", len(window), cap(window), window)
}