Go Slice содержит три элемента: данные, длину и емкость.
s := make([]int, 0, 10)
Переменная s представляет собой слайс с длиной 0 и емкостью 10. Встроенные функции len () и cap () позволяют получить длину и емкость фрагмента:
len(s) == 0
cap(s) == 10
Чтобы увеличить длину среза, просто повторите срез:
s = s[0:5]
// len(s) == 5
// cap(s) == 10
Чтобы уменьшить длину, вы можете взять подрез:
s = s[0:1]
// len(s) == 1
Есть несколько более коротких способов вызова make ():
a := make([]int, 10)
// len(a) == cap(a) == 10
b := make([]int)
// len(b) == cap(b) == 0
Это все хорошо, но что если вам нужно увеличить длину среза сверх его емкости? Для этого вам нужно выделить новый фрагмент и скопировать содержимое старого фрагмента в новый. (Функция «копировать» является еще одной встроенной.)
t := make([]int, len(s), 20)
copy(t, s)
Документ Effective Go продвигает этот пример немного дальше, реализуя функцию Append, которая добавляет один фрагмент к другому, изменяя его размер при необходимости.
Ломтики поддерживаются массивами; когда вы делаете () срез определенной емкости, массив этой емкости выделяется в фоновом режиме. Срез фактически становится «умным указателем» на этот массив. Если вы передадите этот срез (или подлис этого среза) другой функции, он будет передан как указатель на этот же массив. Это делает создание срезов очень дешевым - это дорогое выделение резервного массива.
Стандартная библиотека Go включает в себя несколько контейнерных пакетов - например, векторных - которые устраняют необходимость вручную управлять слайсами. Используйте слайсы для скорости и более сложные классы контейнеров для удобства. (Сказав это, я все еще использую ломтики для большинства вещей.)
Вам может быть интересно, зачем вам идти на все эти неприятности. В конце концов, многие языки предоставляют динамически изменяемые массивы в качестве примитивов. Причина этого связана с философией Го. Разработчики языка не предполагают, что знают, какая политика выделения подходит для вашей программы; вместо этого они дают вам инструменты, необходимые для построения ваших собственных структур данных.