Junior
105
questionbank

Как можно нарезать слайс в Go? Какие нюансы и подводные камни могут возникнуть?

Получайте ответы на вопросы в реальном времени с Sobes Copilot
Ответ от нейросети sobes.tech

Нарезка слайса в Go достигается с помощью синтаксиса a[low:high], где low — начальный индекс (включительно), а high — конечный индекс (не включительно). Также доступны варианты a[:high] (от начала до high), a[low:] (от low до конца) и a[:] (копия всего слайса).

Нюансы и подводные камни:

  • Общий базовый массив: Нарезка слайса создает новый слайс, который делит базовый массив с исходным слайсом. Изменения в элементах одного слайса отразятся в другом (если они ссылаются на один и тот же базовый массив).
  • Изменение capacity: Новый слайс имеет ту же capacity, что и исходный, уменьшенную на low. Это может привести к неожиданным изменениям при добавлении элементов (append) в нарезанный слайс, если его capacity будет исчерпана раньше capacity исходного слайса.
  • Выход за границы: Индексы low и high должны быть в пределах [0, len(a)] и [0, cap(a)] соответственно. Нарушение этих правил приведет к панике во время выполнения: panic: slice bounds out of range.
  • Создание независимой копии: Чтобы создать независимую копию слайса, необходимо использовать функцию copy.

Примеры:

go

Таблица, иллюстрирующая cap нарезанных слайсов:

Исходный слайс slen(s)cap(s)НарезкаРезультатlen нарезанногоcap нарезанного
{1, 2, 3, 4, 5}55s[1:3]{2, 3}24
{1, 2, 3, 4, 5}55s[:3]{1, 2, 3}35
{1, 2, 3, 4, 5}55s[2:]{3, 4, 5}33
{1, 2, 3, 4, 5}55s[:]{1, 2, 3, 4, 5}55

Понимание работы с базовым массивом и capacity является ключевым для эффективной работы со слайсами в Go и избежания unexpected results.