Выражения срезов создают подстроку или срез из строки, массива, указателя на массив или среза. Существует два варианта: простая форма, которая определяет нижнюю и верхнюю границу, и полная форма, которая также определяет границу емкости.
Простые выражения срезов (slice expressions)
Для строки, массива, указателя на массив или среза a, первичное выражение
a[low : high]
создает подстроку или срез. Индексы low и high выбирают, какие элементы операнда a появляются в результате. Результат имеет индексы, начинающиеся с 0, а длина равна high - low. После нарезки (slicing) массива a
a := [5]int{1, 2, 3, 4, 5}
s := a[1:4]
срез s имеет тип []int, длину 3, емкость 4 и элементы
s[0] == 2
s[1] == 3
s[2] == 4
Для удобства любой из индексов может быть опущен. Отсутствующий нижний индекс по умолчанию равен нулю; отсутствующий верхний индекс по умолчанию равен длине нарезанного операнда:
a[2:] // тоже что и a[2 : len(a)]
a[:3] // тоже что и a[0 : 3]
a[:] // тоже что и a[0 : len(a)]
Если a - указатель на массив,
a[low : high] является сокращением для (*a)[low : high].
Для массивов или строк индексы находятся в диапазоне, если 0 <= low <= high <= len(a), в противном случае они находятся вне диапазона. Для срезов верхняя граница индекса - это ограничение емкости cap(a), а не длина. Постоянный индекс должен быть неотрицательным и представим значением типа int; для массивов или постоянных строк постоянные индексы также должны находиться в диапазоне. Если оба индекса постоянны, они должны удовлетворять требованию low <= high (нижний <= верхний). Если индексы выходят за пределы диапазона во время выполнения (run time), возникает паника во время выполнения (run-time panic).
За исключением нетипизированных строк, если нарезанный операнд является строкой или срезом, результатом операции среза будет непостоянное значение того же типа, что и операнд. Для нетипизированных строковых операндов результатом является непостоянное значение типа string. Если нарезанный операнд является массивом, он должен быть адресуемым, а результатом операции среза является срез с элементом того же типа, что и массив.
Если нарезанный операнд валидного выражения среза является нулевым срезом, результатом является нулевой срез. В противном случае, если результатом является срез, он разделяет свой базовый массив с операндом.
Полные выражения срезов
Для массива, указателя на массив или среза (но не строки), первичное выражение
a[low : high : max]
строит срез того же типа, с той же длиной и элементами, что и простое выражение среза a[low : high]. Кроме того, оно контролирует емкость результирующего среза, устанавливая его равным max - low. Только первый индекс может быть опущен; по умолчанию 0. После нарезки массива a
a := [5]int{1, 2, 3, 4, 5}
t := a[1:3:5]
срез t имеет тип []int, длину 2, емкость 4 и элементы
t[0] == 2
t[1] == 3
Что касается простых выражений среза, если a является указателем на массив, то a[low : high : max] является сокращением для (*a)[low : high : max]. Если нарезанный операнд является массивом, он должен быть адресуемым.
Индексы находятся в диапазоне, если 0 <= low <= high <= max <= cap(a), в противном случае они находятся вне диапазона. Постоянный индекс должен быть неотрицательным и представим значением типа int; для массивов постоянные индексы также должны находиться в диапазоне. Если несколько индексов являются постоянными, присутствующие константы должны находиться в диапазоне относительно друг друга. Если индексы выходят за пределы диапазона во время выполнения, возникает паника во время выполнения.
Читайте также:
- Спецификация Go: первичные выражения (primary expressions), селекторы (selectors)
- Спецификация Go: типы массивов (array), типы срезов (slice)
- Спецификация Go: индексные выражения (index expressions)
Комментариев нет:
Отправить комментарий