Загрузка…
Загрузка…
Go · junior · сложность 4
В Go форма полного среза a[low:high:max] позволяет вам контролировать не только длину (len), но и емкость (cap) нового slice. Это важный инструмент для контроля побочных эффектов во время append.
Для s := a[low:high:max]:
len(s) = high - low
cap(s) = max - low
При условии правильных пределов:
0 <= low <= high <= max <= cap(a) (для основы среза)Видимое ограничение емкости: можно «отрезать» доступ к хвосту базовый массив, даже если он физически существует.
Безопаснее append: если cap искусственно уменьшить, append
быстрее перераспределять память вместо перезаписи соседних данных в общем
array.
Лучшая изоляция между фрагментами кода: это особенно полезно, когда один фрагмент передается на другой уровень функции или системы, и вам это не нужно «врастать» в чужую область.
a[2:5] дает len=3, cap расширяется до конца базового массива.
a[2:5:5] дает len=3, cap=3 - далее append нет в наличии и
принудительно создает новый массив.
Третий индекс в a[low:high:max] — это рычаг точного управления cap. Он нужен, когда важно контролировать рост slice, избежать неожиданной перезаписи разделяемой памяти и сделать поведение кода предсказуемым.
package main
import "fmt"
func main() {
a := []int{0, 1, 2, 3, 4, 5}
s := a[2:4:4] // len=2 (2,3), cap=2
fmt.Println(len(s), cap(s)) // 2 2
s = append(s, 99) // новий backing array, а не розширення в a
fmt.Println(a) // [0 1 2 3 4 5]
fmt.Println(s) // [2 3 99]
}В Go форма полного среза a[low:high:max] позволяет вам контролировать не только длину (len), но и емкость (cap) нового slice.