пятница, 24 мая 2019 г.

Спецификация Go: типы массивов (array), типы срезов (slice)

Типы массивов (array types)

Массив (array) - это пронумерованная последовательность элементов одного типа, называемая типом элемента (element type). Количество элементов называется длиной массива и никогда не бывает отрицательным.

ArrayType   = "[" ArrayLength "]" ElementType .
ArrayLength = Expression .
ElementType = Type .

Длина является частью типа массива; она должна вычисляться как неотрицательная константа, представимая значением типа int. Длина массива a может быть определена с помощью встроенной функции len. Элементы могут быть адресованы целочисленными индексами от 0 до len(a)-1. Типы массивов всегда одномерны, но могут быть составлены для формирования многомерных типов.

Примеры:

[32]byte
[2*N] struct { x, y int32 }
[1000]*float64
[3][5]int
[2][2][2]float64  // то же самое что и [2]([2]([2]float64))

Типы срезов (slice types)

Срез (slice) является дескриптором непрерывного сегмента базового массива и обеспечивает доступ к пронумерованной последовательности элементов из этого массива. Тип среза обозначает набор всех срезов массивов его типа элемента. Количество элементов называется длиной среза и никогда не бывает отрицательным. Значение неинициализированного среза равно нулю.

SliceType = "[" "]" ElementType .

Длина среза s может быть обнаружена встроенной функцией len; в отличие от массивов, длина среза может измениться во время выполнения. Элементы могут быть адресованы целочисленными индексами от 0 до len(s)-1. Индекс среза данного элемента может быть меньше, чем индекс того же элемента в базовом массиве.

После инициализации срез всегда ассоциируется с базовым массивом, который содержит его элементы. Следовательно, срез совместно использует хранилище со своим массивом и с другими срезами того же массива; напротив, отдельные массивы всегда представляют собой разные хранилища.

Массив, лежащий в основе среза, может выходить за конец среза. Емкость (capacity) является мерой этой степени: это сумма длины среза и длины массива за пределами среза; срез длиной до этой емкости можно создать, нарезав новый из исходного среза. Емкость среза а можно определить с помощью встроенной функции cap(а).

Новое, инициализированное значение среза для данного типа элемента T создается с использованием встроенной функции make, которая принимает тип среза и параметры, указывающие длину и, необязательно, емкость. Срез, созданный с помощью make, всегда выделяет новый скрытый массив, на который ссылается возвращаемое значение среза. То есть выполнение

make([]T, length, capacity)

создает тот же срез, что и выделение массива и последующее создание срезов для него, поэтому эти два выражения эквивалентны:

make([]int, 50, 100)
new([100]int)[0:50]

Как и массивы, срезы всегда одномерны, но могут быть составлены для создания объектов более высокого размера. В массивах массивов внутренние массивы по построению всегда имеют одинаковую длину; однако в случае срезов (или массивов срезов) внутренняя длина может динамически изменяться. Кроме того, внутренние срезы должны быть инициализированы индивидуально.


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


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

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