Чтобы получить хорошее представление о языке программирования Go, важно понимать массивы и срезы.
Если вы разработчик или системный администратор, который является новичком в Go, важно понимать следующие ключевые различия в том, как обрабатывается массив в Go по сравнению с другим языком:
- Вы не можете изменить размер массива, как только он объявлен.
- Размер массива должен быть указан при объявлении массива. Чтобы преодолеть это ограничение, вы будете использовать срезы по большей части в GoLang. Но все же важно понимать, как работает массив, так как срезы работают поверх массива.
- Когда вы присваиваете массив другому массиву, по сути вы копируете все элементы из одного в другой.
- Вышесказанное важно понимать, так как при передаче массива в качестве параметра функции функция действительно получит копию массива и будет работать с ней. Это не указатель, который мы передаем. Это копия всего массива.
Эта статья объясняет следующие основы обработки массивов в Go, с полным рабочим примером вместе с выводом, который представлен в конце этой статьи.
- Объявить переменную массива с определенным размером
- Присвоить значение определенному элементу в массиве
- Доступ к определенному элементу в массиве
- Показать все или определенные элементы из массива
- Инициализировать и присвоить значения массиву одновременно
- Инициализируйте массив, используя многострочный синтаксис
- Определить длину массива – сколько элементов существует?
- Значение элемента массива по умолчанию
- Проход по элементам массива с использованием For и Range
- Переборка массива и получение только значения (Ignore Array Index)
- Инициализируйте элементы Int Array с последовательностью чисел
- Определить и инициализировать многомерные массивы
- Полный рабочий код GoLang со всеми примерами массивов
В следующей статье мы рассмотрим срезы в GoLang с примерами.
1. Объявите переменную массива с определенным размером
var distros [5]string var ids [5]int
В приведенном выше:
- var – ключевое слово
- distros, ids – имя переменной
- 5 – это длина массива. Вы должны указать длину массива при объявлении массива. Как только вы укажете размер массива, вы не сможете изменить его размер.
- string, int – Тип массива. В этом примере distros – это строковый массив размером 5, а id – массив int с размером 5.
2. Присвойте значение определенному элементу в массиве
distros[0] = "Ubuntu" distros[1] = "CentOS" distros[2] = "RedHat" distros[3] = "Debian" distros[4] = "OpenBSD" ids[0] = 1 ids[1] = 2 ids[2] = 3 ids[3] = 4 ids[4] = 5
Заметки:
- Как вы видите выше, индексная ссылка, которую вы будете использовать для 1-го элемента массива, равна 0 (не 1).
- distros[0] ссылается на 1-й элемент в массиве distros
- ids[4] ссылается на 5-й элемент массива ids (который также является последним элементом массива ids в этом примере)
Если вы попытаетесь присвоить значение в массиве, размер которого превышает размер массива, вы получите сообщение об ошибке.
Например, если вы сделаете следующее, произойдет сбой, потому что наш массив distros имеет только 5 элементов, и мы пытаемся присвоить значение шестому элементу, которого нет в нашем массиве. Вы не можете добавить новый элемент в существующий массив.
distros[5] = "Solaris"
Сообщение об ошибке:
./array.go:11:10: invalid array index 5 (out of bounds for 5-element array)
3. Доступ к определенному элементу в массиве
mydistro := distros[1] myid := ids[3]
Заметки:
- Мы присваиваем значение 1-го элемента массива distros переменной mydistro
- Присвоение 3-го элемента массива ids переменной myid
- : = объявляет и инициализирует переменную одновременно
- Также для: = вам не нужно указывать тип переменной mydistro или myid
- : = know будет определять тип переменной в зависимости от значения, которое будет присвоено.
- Таким образом, mydistro станет строковой переменной, а myid автоматически станет переменной int
4. Показать все или определенные элементы из массива
fmt.Println(distros) fmt.Println(ids) fmt.Println("distros[2] = ", distros[2]) fmt.Println("ids[2] = ", ids[2])
Чтобы отобразить определенный элемент массива или все элементы в массиве, используйте fmt.Println, как показано выше.
Убедитесь, что пакет «fmt» импортирован сверху, используя команду import
Когда вы выводите весь массив, в выводе он будет отображать все элементы в квадратных скобках, как показано ниже.
[1 2 3 4 5] [Ubuntu CentOS RedHat Debian OpenBSD]
5. Инициализировать и присвоить значения массиву одновременно
Вместо того, чтобы сначала объявлять переменную массива, а затем отдельно инициализировать значения, вы можете объединить их вместе.
Следующее будет одновременно объявлять и инициализировать массив с заданными значениями.
os := [3]string{"Linux", "Mac", "Windows"} fibonacci := [6]int{1, 1, 2, 3, 5, 8}
6. Инициализируйте массив, используя многострочный синтаксис
Для лучшего понимания и удобочитаемости вы также можете использовать многострочный синтаксис при инициализации и присвоении значений массиву, как показано ниже.
temperature := [3]float64{ 98.5, 65.5, 83.2, }
Но имейте в виду, что в многострочном синтаксисе вы должны указывать запятую после последнего элемента. Как вы видите выше, после 83,2 запятая
Преимущество этого синтаксиса в том, что вы можете закомментировать определенное значение в массиве, не беспокоясь об удалении запятой, как показано ниже. В следующем примере мы закомментировали последнее значение в массиве. Но нам не пришлось беспокоиться об удалении запятой после Алисии.
names := [3]string{ "AndreyEx", "Jason", "Alica", // "Rita", }
7. Определите длину массива – сколько элементов существует?
Функция len возвращает общее количество элементов в данном массиве. Вы можете присвоить значение функции len и другой переменной.
arraySize := len(distros) fmt.Println("Количество дистрибутивов = ", len(distros)) fmt.Println("Количество идентификаторов = ", len(ids))
Вывод:
Количество дистрибутивов = 5 Количество идентификаторов = 5
8. Значение по умолчанию элемента массива
В целочисленном массиве, если вы не присвоите значение массиву и попытаетесь его распечатать, вы увидите 0 в качестве значений для элементов, которым вы не присвоили значение. По умолчанию целочисленные массивы инициализируются со значениями 0.
В следующем примере мы определили массив empIds с 5 элементами, но присваивали значения только первым трем элементам.
empIds := [5]int{101, 102, 103} fmt.Println("empIds = ",empIds)
Как видно из следующего вывода, последним двум элементам автоматически присваивается значение 0.
empIds = [101 102 103 0 0]
Для строковых массивов, если вы не назначите значение, оно просто будет иметь пустое значение. Мы просто присвоили два элемента и оставили три последних элемента пустыми.
empNames := [5]string{"AndreyEx","Jason"} fmt.Println("empNames = ",empNames)
Выход:
empNames = [AndreyEx Jason ]
9. Цикл элементов массива с использованием For и Range
Используя команды for и range, вы можете перебрать все элементы в данном массиве
for index, value := range distros { fmt.Println(index, " = ", value) }
В приведенном выше:
- range distros – range – команда go, которая возвращает номер индекса и значение элемента массива.
- Вы можете назначить вывод команды range циклу for и пройти через все элементы
- для i, значение – Здесь укажите две переменные для команды for. Имя переменной может быть любым. Это просто произошло для ясности, мы используем индекс и значение в качестве имени переменной здесь.
10. Переберите массив и получите только значения (Ignore Array Index)
Если вы просто хотите использовать элемент массива, а не индекс, то указание переменной индекса, как показано ниже, выдаст сообщение об ошибке.
В этом примере мы просто хотим просмотреть все значения в массиве ids и суммировать их. Таким образом, мы действительно не заботимся о переменной индекса здесь.
total := 0 for index, value := range ids { total = total + value } fmt.Println("всего всех идентификаторов = ", total)
Выше будет выбрасывать следующую ошибку:
./array.go:54:7: index declared and not used
В этом случае просто замените переменную индекса в цикле for символом подчеркивания _, как показано ниже.
for _, value := range ids { total = total + value }
Символ подчеркивания _ указывает на языке Go, что вы берете значение определенной переменной (в данном случае индекс) и просто игнорируете его.
11. Инициализируйте элементы массива Int с помощью числовой последовательности.
В следующем примере показано, как можно назначить последовательные значения массиву init, используя цикл for.
var sequence [10]int counter := 10 for index, _ := range sequence { sequence[index] = counter counter = counter + 5 } fmt.Println() fmt.Println("sequence = ",sequence)
Выше мы используем for и range для обхода элементов массива и присваивания значения. Так как мы заботимся только об индексе, а не о текущем значении элемента массива, мы используем символ подчеркивания _ для значения в цикле for, как показано выше.
В этом примере последовательность начинается с 10 с шагом 5. Таким образом, первое значение массива будет 10 и с последующим увеличением до 5.
12. Определите и инициализируйте многомерные массивы
Go не имеет понятия многомерного массива. Но вы можете создавать массивы, которые можно рассматривать и использовать как многомерный массив, как показано ниже.
count := 1 var multi [4][2]int for i := 0; i < 4; i++ { for j := 0; j < 2; j++ { multi[i][j] = count count++ } } fmt.Println("Массив 4 x 2 : ", multi)
В приведенном выше примере мы создаем массив init размером 4 x 2 (4 строки и 2 столбца) и присваиваем значения отдельным элементам с шагом 1, начиная со значения 1.
Код Go со всеми примерами массивов
Для справки, следующий рабочий код go содержит все приведенные выше примеры в одной программе.
package main import "fmt" func array() { // Строковый массив fmt.Println("1. Строковый массив : ") var distros [5]string distros[0] = "Ubuntu" distros[1] = "CentOS" distros[2] = "RedHat" distros[3] = "Debian" distros[4] = "OpenBSD" mydistro := distros[1] fmt.Println("mydistro = ", mydistro) fmt.Println("distros[2] = ", distros[2]) fmt.Println("distros = ", distros) fmt.Println("Количество дистрибутивов = ", len(distros)) // Целочисленный массив (Numbers) fmt.Println() fmt.Println("2. Целочисленный массив : ") var ids [5]int ids[0] = 1 ids[1] = 2 ids[2] = 3 ids[3] = 4 ids[4] = 5 myid := ids[3] fmt.Println("myid = ", myid) fmt.Println("ids[2] = ", ids[2]) fmt.Println("ids = ", ids) fmt.Println("Количество идентификаторов = ", len(ids)) // Одновременно объявить и инициализировать массив fmt.Println() fmt.Println("3. Одновременно объявить и инициализировать массив : ") os := [3]string{"Linux", "Mac", "Windows"} fmt.Println("os = ",os) fmt.Println("Количество ОС = ", len(os)) fibonacci := [6]int{1, 1, 2, 3, 5, 8} fmt.Println("fibonacci = ",fibonacci) // Синтаксис инициализации многострочного массива fmt.Println() fmt.Println("4. Синтаксис инициализации многострочного массива : ") temperature := [3]float64{ 98.5, 65.5, 83.2, } fmt.Println("temperature = ", temperature) names := [3]string{ "AndreyEx", "Jason", "Alica", // "Rita", } fmt.Println("names = ", names) // Значения по умолчанию в массиве fmt.Println() fmt.Println("5. Значения по умолчанию в массиве : ") empIds := [5]int{101, 102, 103} fmt.Println("empIds = ",empIds) empNames := [5]string{"AndreyEx","Jason"} fmt.Println("empNames = ",empNames) // Цикл через массив, использующий For и Range fmt.Println() fmt.Println("6. Цикл через массив, использующий For и Range : ") for index, value := range distros { fmt.Println(index, " = ", value) } // Цикл через массив, использующий For и Range (Игнорировать Индекс) fmt.Println() fmt.Println("7. Цикл через массив, использующий For и Range (Игнорировать Индекс) : ") total := 0 for _, value := range ids { total = total + value } fmt.Println("всего всех идентификаторов = ", total) // Инициализировать целочисленный массив последовательностью fmt.Println() fmt.Println("8. Инициализировать целочисленный массив последовательностью : ") var sequence [10]int counter := 10 for index, _ := range sequence { sequence[index] = counter counter = counter + 5 } fmt.Println("sequence = ",sequence) // Многомерный массив fmt.Println() fmt.Println("9. Многомерный массив : ") count := 1 var multi [4][2]int for i := 0; i < 4; i++ { for j := 0; j < 2; j++ { multi[i][j] = count count++ } } fmt.Println("Массив 4 x 2 : ", multi) }
Полный вывод для приведенного выше примера кода:
1. Строковый массив : mydistro = CentOS distros[2] = RedHat distros = [Ubuntu CentOS RedHat Debian OpenBSD] Количество дистрибутивов = 5 2. Целочисленный массив : myid = 4 ids[2] = 3 ids = [1 2 3 4 5] Количество идентификаторов = 5 3. Одновременно объявить и инициализировать массив : os = [Linux Mac Windows] Количество ОС = 3 fibonacci = [1 1 2 3 5 8] 4. Синтаксис инициализации многострочного массива : temperature = [98.5 65.5 83.2] names = [AndreyEx Jason Alica] 5. Значения по умолчанию в массиве : empIds = [101 102 103 0 0] empNames = [AndreyEx Jason ] 6. Цикл через массив, использующий For и Range : 0 = Ubuntu 1 = CentOS 2 = RedHat 3 = Debian 4 = OpenBSD 7. Цикл через массив, использующий For и Range (Игнорировать Индекс) : всего всех идентификаторов = 15 8. Инициализировать целочисленный массив последовательностьюИнициализировать целочисленный массив последовательностьюИнициализировать целочисленный массив последовательностью : sequence = [10 15 20 25 30 35 40 45 50 55] 9. Многомерный массив : Массив 4 x 2 : [[1 2] [3 4] [5 6] [7 8]]