Skip to content

Array (массив)

В следующих главах мы рассмотрим:

  • что такое массив и декларация массивов;

  • как работать с массивами.

Что такое массив

Массив (array) — это набор с фиксированным количеством последовательных элементов.

  • Массив хранит коллекцию элементов одного типа (однородных).

  • Элементы массива хранятся в непрерывных ячейках памяти.

  • Массив имеет фиксированный размер, его нельзя изменить, то есть добавить элемент в массив невозможно.

  • Способы объявления.

В литерале массива “…” нотация указывает на длину, равную количеству элементов в литерале.

Массивы являются важным строительным блоком в Go, но, подобно фундаменту здания, они часто скрыты под более видимыми компонентами. Мы кратко поговорим о массивах, прежде чем перейдем к более интересной, мощной и заметной идее срезов.

Определение типа массива указывает длину и тип элемента. Например, тип [4]int представляет собой массив из четырех целых чисел. Размер массива фиксирован; его длина является частью его типа ([4]int и [5]int являются разными, несовместимыми типами). Массивы можно индексировать обычным способом, поэтому выражение s[n] обращается к n-му элементу, начиная с нуля.

Массивы не часто встречаются в программах Go, потому что размер массива является частью его типа, что ограничивает его использование.

Декларация

Массивы не нужно инициализировать явно; нулевое значение массива — это готовый к использованию массив, элементы которого сами обнуляются.

Массив var buffer [256]byte объявляет переменную buffer, которая содержит 256 байт. Массив buffer включает размер [256]byte. Массив размером 512 байт будет иметь свой тип [512]byte.

Каждое обсуждение типа среза в Go начинается с обсуждения чего-то, что не является срезом, а именно — с массива в Go. Массивы в Go имеют два важных свойства:

  1. Имеют фиксированный размер; [5]int является массивом из 5 ints и отличается от типа [3]int.

  2. Это типы значений. Рассмотрим этот пример:

 

Самое время протестировать код!

Оператор b :\= a объявляет новую переменную b типа [5]int и копирует содержимое a в b.
 Внимание! Это стандартное поведение в Golang. При присвоении значения оно копируется в новую переменную. При передаче переменных в виде аргументов, значения тоже копируются.
 Обновление b не влияет на содержимое a, потому что a и b являются независимыми значениями.

Литерал массива можно указать так.

Также ты можешь попросить компилятор подсчитать элементы массива за тебя.

В обоих случаях тип переменной b [2]string.

Внутреннее устройство массива

Копии массива ссылаются на разные области памяти, то есть если ты создашь переменную и передашь ей массив по значению не по ссылке), массив скопируется в новую переменную.

Слева на картинке показана передача массива в переменную по значению, после которой произойдет копирование и в памяти будут созданы еще четыре элемента int. Справа на картинке показана передача массива по ссылке, после которой тип у переменной с будет *[4]int.

Представление в памяти [4]int состоит всего из четырех целочисленных значений, расположенных последовательно.

Массивы Go — это значения. Переменная массива обозначает весь массив; это не указатель на первый элемент массива, как в случае C. Это означает, что когда ты присваиваешь или передаешь значение массива, ты делаешь копию его содержимого. Чтобы избежать копирования, ты можешь передать указатель на массив, но тогда это указатель на массив, а не значение массива. Это один из способов представить массивы как своего рода структуру, но с индексированными, а не именованными полями.