Полносрезное выражение в Go
Полносрезное выражение [::]
(full slice expression, далее по тексту «баян») имеет такой синтаксис:
s[low : high : max]
Баян создает срез длиной high-low
и емкостью max-low
. Используется крайне редко.
Чтобы понять разницу между обычным срезом и баяном, рассмотрим пример.
Как вы знаете, под каждым срезом лежит массив с данными (сам срез данных не содержит). Обычно этот массив создается неявно, но мы для наглядности сделаем так:
arr := [5]int{1, 2, 3}
// [1 2 3 0 0]
s := arr[0:3]
// [1 2 3]
len(s) // 3
cap(s) // 5
Срез s
указывает на массив arr
. Его длина (length) равна 3, а емкость (capacity, размер массива под срезом) равна 5.
Добавление элемента в срез добавляет его в массив, поскольку емкость это позволяет:
s = append(s, 4)
fmt.Println(arr)
// [1 2 3 4 0]
fmt.Println(s)
// [1 2 3 4]
А вот что будет, если создать срез с помощью баяна:
arr := [5]int{1, 2, 3}
// [1 2 3 0 0]
s := arr[0:3:3]
// [1 2 3]
len(s) // 3
cap(s) // 3
Все как раньше, только емкость среза равна 3. Поэтому добавление элемента в срез приведет к созданию нового массива под срезом. Исходный массив arr
не изменится:
s = append(s, 4)
fmt.Println(arr)
// [1 2 3 0 0]
fmt.Println(s)
// [1 2 3 4]
Такие дела.
★ Подписывайтесь на новые заметки.