Типы массивов (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]
Как и массивы, срезы всегда одномерны, но могут быть составлены для создания объектов более высокого размера. В массивах массивов внутренние массивы по построению всегда имеют одинаковую длину; однако в случае срезов (или массивов срезов) внутренняя длина может динамически изменяться. Кроме того, внутренние срезы должны быть инициализированы индивидуально.
Читайте также:
- Спецификация Go: типы (types)
- Спецификация Go: логические, числовые, строковые типы
- Основы Go: массивы (arrays)
Комментариев нет:
Отправить комментарий