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

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

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

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

Форум Гоферов

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

Go на Форум

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

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

Go в ВК Go в Telegram

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  1. Каких ошибок можно избежать, используя ключевое слово range для итерации через массив?
  2. Когда вместо range лучше использовать цикл for?

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

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

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

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

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

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

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

  1. Как Земле удалось выжить в planetsMarkII из Листинга 6?
  2. Как можно модифицировать Листинг 7, чтобы массив planets из main изменился?

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

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

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

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

Заключение

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

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

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

Понравилась статья?

Поддержи наш проект, чтобы мы могли создать больше хорошего контента!