Когда мы фильтруем фрагменты в Go, типичным решением является создание нового фрагмента для отфильтрованных элементов (var filtered []int).
Однако этот метод приводит к дополнительному выделению памяти, потому что мы создаём пустой слайс, и при каждом добавлении элемента нужно будет заново аллоцировать память.
Более разумным способом решения этой проблемы является такое создание filtered := numbers[:0]
Так мы создадим слайс с ёмкостью numbers и избегаем дополнительных выделений памяти в дальнейшем
В выражении numbers[:0]
, 0
указывает на индекс, до которого (не включая его) будут скопированы элементы из среза numbers
. По сути, это создает новый срез, который имеет ту же емкость, что и исходный срез numbers
, но не содержит никаких элементов.
Вот как это работает:
numbers[:]
создает копию срезаnumbers
, включая все его элементы.numbers[:n]
, гдеn
— это неотрицательное целое число, создает новый срез, который содержит первыеn
элементовnumbers
.numbers[:0]
создает новый срез, который не содержит элементов, но имеет ту же емкость, что иnumbers
. Это означает, что при добавлении элементов в срезfiltered
с помощью функцииappend
память будет выделена из исходного массива, который лежит в основе срезаnumbers
, до тех пор, пока не будет превышена его емкость.