
Чтобы получить хорошее представление о языке программирования 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]]
Редактор: AndreyEx
Поделиться в соц. сетях: