пятница, 7 июня 2019 г.

Спецификация Go: выражения срезов (slice expressions)

Выражения срезов создают подстроку или срез из строки, массива, указателя на массив или среза. Существует два варианта: простая форма, которая определяет нижнюю и верхнюю границу, и полная форма, которая также определяет границу емкости.

Простые выражения срезов (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; для массивов постоянные индексы также должны находиться в диапазоне. Если несколько индексов являются постоянными, присутствующие константы должны находиться в диапазоне относительно друг друга. Если индексы выходят за пределы диапазона во время выполнения, возникает паника во время выполнения.


Читайте также:


Комментариев нет:

Отправить комментарий