Golang для начинающих

После изучения данного урока вы сможете:

  • Объявлять и инициализировать массивы;
  • Присваивать и получать доступ к элементам массива;
  • Итерировать элементы массива.

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

Премиум 👑 канал по Golang

Рекомендуем вам супер TELEGRAM канал по Golang где собраны все материалы для качественного изучения языка. Удивите всех своими знаниями на собеседовании! 😎

Подписаться на канал

Уроки, статьи и Видео

Мы публикуем в паблике ВК и Telegram качественные обучающие материалы для быстрого изучения Go. Подпишитесь на нас в ВК и в Telegram. Поддержите сообщество Go программистов.

Go в ВК ЧАТ в Telegram


Содержание статьи

Быть может, вы что-то коллекционируете? Или собирали что-то в детстве? Марки, монеты, наклейки, книги, туфли, медали, диски или что-то еще?

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

Объявление массива и получение доступа к его элементам

Следующий массив planets содержит ровно восемь элементов:

У каждого элемента массива одинаковый тип. В данном случае planets является массивом строк.

К элементу массива можно получить доступ через использование квадратных скобок [] с нужным индексом, отсчет начинается с 0. Внизу представлен пример программы, а также проиллюстрирована схема.

Массив Golang с планетами

Планеты с индексами от 0 до 7

Хотя только трем планетам были присвоены индексы, всего в массиве planets находится восемь элементов. Длину массива можно определить через встроенную функцию len. Другие элементы с нулевым значением своего типа, то есть пустая строка:

На заметку: В Go есть полезные встроенные функции, использовать которые можно без оператора import. Функция len определяет длину типов. В данном случае возвращается размер массива.

Вопросы для проверки:

  1. Как можно получить доступ к первому элементу массива planets?
  2. Каким будет значение элементов нового массива целых чисел по умолчанию?
Ответы
  1. planets[0]
  2. Изначально значение элементов массива является нулевым, следовательно, для массива целых чисел значение будет 0.

Диапазон значений массива в Golang

У массива из восьми элементов индексы от 0 до 7. При попытке получить доступ к элементу за пределами диапазона массива компилятор Go сообщит об ошибке:

Если компилятор Go не в состоянии зафиксировать ошибку, во время запуска программы может произойти сбой:

Сбой приведет к аварийному завершению программы, что все-таки лучше, нежели модификация памяти, что не относится к массиву planets. Будь это язык программирования вроде С, все могло бы закончиться неопределенным поведением.

Вопрос для проверки:

Приведет ли planets[11] к ошибке во время компиляции или к сбою во время запуска?

Ответ

Компилятор Go зафиксирует неправильно указанный индекс массива.

Инициализация массивов через композитные литералы в Go

Композитный литерал является кратким синтаксисом для инициализации любого композитного типа с нужными значениями. Вместо объявления массива и присваивания каждого элемента по-очереди, композитный литеральный синтаксис Go объявит и инициализирует массив за один шаг, как показано в следующем примере:

Внутри фигурных скобок {} находятся пять строк, что разделяются запятыми и являются элементами нового массива.

При работе с крупными массивами разделение композитного литерала на множество строк может сделать код более понятным. Компилятор Go может подсчитать количество элементов внутри композитного литерала, для этого вместо числа ставится многоточие (...) . У массива planets в следующем примере по-прежнему фиксированная длина:

Задание для проверки:

Сколько планет указано в Листинге 3? Используйте встроенную функцию len, чтобы выяснить.

Решение

В массиве planets восемь элементов (8).

Итерация через массивы в Go

Итерация через каждый элемент массива напоминает итерацию каждого символа строки. Мы ранее говорили об этом в уроке о строках в Golang. Это показано в примере ниже:

Ключевое слово range возвращает индекс и значение каждого элемента массива посредством использования меньшего количества кода и меньшей вероятностью совершения ошибок, что показано в коде ниже:

Результат будет одинаковым для обеих программ:

На заметку: Помните, что вы можете использовать пустой идентификатор (подчеркивание), если вам не нужен индекс переменной, предоставленный range.

Вопросы для проверки:

  1. Каких ошибок можно избежать, используя ключевое слово range для итерации через массив?
  2. Когда вместо range лучше использовать цикл for?
Ответы
  1. Использование ключевого слова range делает цикл проще, а также помогает избежать ошибок превышения значения допустимого диапазона. К примеру, i <= len(dwarfs).
  2. Цикл for лучше использовать, когда вам нужно что-то настраиваемое вроде обратной итерации или получения доступа к каждому второму элементу.

Копирование массивов в Golang

Присваивание массива новой переменной или передача его функции приводит к копированию всего его содержимого, что показано в следующем примере:

У массивов есть значения, функции также передают значения, а это значит, что функция terraform в следующем листинге совершенно неэффективна:

Функция terraform оперирует с копией массива planets, поэтому модификации не затронут planets в функции main.

Также важно понимать, что длина массива является частью его типа. Типы [8]string и [5]string оба представляют собой наборы строк, но это совершенно разные типы. При попытке передать массив с другой длиной компилятор Go сообщит об ошибке:

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

Задания для проверки:

  1. Как Земле удалось выжить в planetsMarkII из Листинга 6?
  2. Как можно модифицировать Листинг 7, чтобы массив planets из main изменился?
Ответы
  1. Переменная planetsMarkII получила копию массива planets, поэтому модификации над каждым массивом не зависят друг от друга;
  2. Функция terraform могла бы вернуть модифицированный массив [8]string, и тогда функция main могла бы переназначить planets на новое значение. В следующем уроке о срезах будут описаны альтернативные варианты.

Массивы из массивов в Golang

Пока что мы разобрали только массивы строк. В Go также можно создавать массивы целых чисел, чисел с плавающей запятой и даже массивы из массивов. Шахматная доска 8 х 8 представлена в следующем примере как массив из массива строк:

Задание для проверки:

Подумайте об игре Судоку. Как можно объявить сетку целых чисел размером 9 х 9?

Решение

var grid [9][9]int

Заключение

  • Массив является упорядоченным набором элементов с фиксированной длиной;
  • Композитные литералы помогают легко инициализировать массивы;
  • Ключевое слово range может итерировать через массивы;
  • При получении доступа к элементам массива нужно придерживаться границ диапазона;
  • Во время присваивания и передачи функций массивы копируются.

Итоговое задание для проверки:

  • Допишите Листинг 8 для отображения всех шахматных фигур на их стартовых позициях, используя символы kqrbnp для черных фигур в верхней части доски, а также символы в верхнем регистре KQRBNP для белых фигур в нижней части доски;
  • Напишите функцию для отображения доски;
  • Вместо строк, используйте [8][8]rune для доски. Помните, что литералы rune должны быть окружены одинарными кавычками и могут выводиться на экран через специальный символ %c.
Решение

4.4 7 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии