Нарезка слайса в Go достигается с помощью синтаксиса a[low:high], где low — начальный индекс (включительно), а high — конечный индекс (не включительно). Также доступны варианты a[:high] (от начала до high), a[low:] (от low до конца) и a[:] (копия всего слайса).
Нюансы и подводные камни:
low. Это может привести к неожиданным изменениям при добавлении элементов (append) в нарезанный слайс, если его capacity будет исчерпана раньше capacity исходного слайса.low и high должны быть в пределах [0, len(a)] и [0, cap(a)] соответственно. Нарушение этих правил приведет к панике во время выполнения: panic: slice bounds out of range.copy.Примеры:
go
Таблица, иллюстрирующая cap нарезанных слайсов:
Исходный слайс s | len(s) | cap(s) | Нарезка | Результат | len нарезанного | cap нарезанного |
|---|---|---|---|---|---|---|
{1, 2, 3, 4, 5} | 5 | 5 | s[1:3] | {2, 3} | 2 | 4 |
{1, 2, 3, 4, 5} | 5 | 5 | s[:3] | {1, 2, 3} | 3 | 5 |
{1, 2, 3, 4, 5} | 5 | 5 | s[2:] | {3, 4, 5} | 3 | 3 |
{1, 2, 3, 4, 5} | 5 | 5 | s[:] | {1, 2, 3, 4, 5} | 5 | 5 |
Понимание работы с базовым массивом и capacity является ключевым для эффективной работы со слайсами в Go и избежания unexpected results.