Все вопросы

21 Коллекции

Что лежит внутри slice?

Три поля: указатель на первый элемент, len и cap. len — сколько элементов видно при индексе и в range. cap — сколько элементов помещается в текущем массиве, начиная с этого указателя. len никогда не больше cap.

Передача slice в функцию копирует заголовок, не элементы. Функция может заменить элементы по индексу, и это увидит вызывающий. Если функция делает append и не возвращает новый заголовок, вызывающий может остаться со старым len.

Выражение s[low:high] строит новый заголовок на том же массиве. Ёмкость такого среза — от low до конца исходной ёмкости.

Пример

Go

len и cap после среза

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)
}