логотип PurpleSchool
логотип PurpleSchool

Массив в Golang

Автор

Дмитрий Нечаев

Массивы в языке программирования Go (или Golang) — это базовый тип данных, который представляет собой фиксированный список элементов одного типа. В этой статье мы рассмотрим, как создавать и использовать массивы в Go, а также их особенности и примеры применения.

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

Массив — это коллекция элементов одного типа фиксированной длины. В отличие от срезов (slice), длина массива не может изменяться после его создания. Массивы используются, когда известно количество элементов, которые нужно хранить, и это количество остается неизменным.

Создание Массивов

В Go массив можно создать несколькими способами:

  1. Объявление массива с заданной длиной

    Самый простой способ создать массив — это задать его длину и инициализировать элементы:

    package main
    
    import "fmt"
    
    func main() {
        var nums [5]int // Создаем массив из 5 элементов, инициализированных нулями
        fmt.Println(nums) // Вывод: [0 0 0 0 0]
    }

    Здесь создается массив nums длиной 5, и все его элементы инициализируются значением по умолчанию (нулем).

  2. Инициализация массива значениями

    Можно сразу инициализировать массив значениями при его объявлении:

    package main
    
    import "fmt"
    
    func main() {
        nums := [5]int{1, 2, 3, 4, 5}
        fmt.Println(nums) // Вывод: [1 2 3 4 5]
    }

    В этом примере создается массив nums длиной 5, который инициализируется заданными значениями.

  3. Неявное определение длины

    Длину массива можно не указывать явно, и она будет рассчитана на основе количества инициализаторов:

    package main
    
    import "fmt"
    
    func main() {
        nums := [...]int{10, 20, 30}
        fmt.Println(nums) // Вывод: [10 20 30]
    }

    В этом случае длина массива nums будет определена автоматически как 3.

Доступ к элементам массива

Для доступа к элементам массива используется синтаксис с квадратными скобками [], где внутри скобок указывается индекс элемента. Индексы начинаются с нуля:

package main

import "fmt"

func main() {
    nums := [3]int{10, 20, 30}
    fmt.Println(nums[0]) // Вывод: 10
    fmt.Println(nums[2]) // Вывод: 30
}

Можно также изменять значение элемента массива:

package main

import "fmt"

func main() {
    nums := [3]int{10, 20, 30}
    nums[1] = 50
    fmt.Println(nums) // Вывод: [10 50 30]
}

Итерация по массиву

Для перебора всех элементов массива можно использовать цикл for с range:

package main

import "fmt"

func main() {
    nums := [4]int{5, 10, 15, 20}
    for index, value := range nums {
        fmt.Printf("Индекс: %d, Значение: %d\n", index, value)
    }
}

Здесь range позволяет получить и индекс, и значение каждого элемента массива.

Длина и емкость массива

Для получения длины массива используется функция len():

package main

import "fmt"

func main() {
    nums := [5]int{1, 2, 3, 4, 5}
    fmt.Println("Длина массива:", len(nums)) // Вывод: 5
}

Массивы в Go имеют фиксированную длину, поэтому емкость массива всегда равна его длине. Таким образом, функция cap() также возвращает длину массива:

package main

import "fmt"

func main() {
    nums := [5]int{1, 2, 3, 4, 5}
    fmt.Println("Емкость массива:", cap(nums)) // Вывод: 5
}

Массивы как аргументы функций

Важно помнить, что массивы в Go передаются в функции по значению, что означает, что передается копия массива, а не ссылка на оригинальный массив:

package main

import "fmt"

func modifyArray(arr [3]int) {
    arr[0] = 100
}

func main() {
    nums := [3]int{1, 2, 3}
    modifyArray(nums)
    fmt.Println(nums) // Вывод: [1 2 3]
}

В этом примере изменение массива внутри функции modifyArray не повлияет на оригинальный массив nums.

Заключение

Массивы в Go — это полезный инструмент для хранения фиксированного количества элементов одного типа. Они обеспечивают высокую производительность, но из-за фиксированной длины их использование может быть ограничено в динамических сценариях. Для более гибкого управления коллекциями данных обычно применяются срезы (slice), которые мы рассмотрели в другой статье. В следующей статье мы изучим, как использовать многомерные массивы в Go.

Стрелочка влевоКопирование слайсов и структур в GolangФункция append в Go (Golang)Стрелочка вправо

Все гайды по Golang

Работа с YAML в GolangПреобразование типов в GolangКонвертация структур в JSON в GolangStrconv в GolangИспользование пакета SQLx для работы с базами данных в GolangРазбираемся с SQL в GolangРазделение строк с помощью функции split в GolangSort в GoПоиск и замена строк в Go - GolangИспользование пакета reflect в GolangРабота с PostgreSQL в GoPointers в GolangПарсинг в GoРабота со списками (list) в GolangПреобразование int в string в GolangРабота с числами с плавающей точкой в GolangРабота с полями в GolangИспользование enum в GolangОбработка JSON в GoЧтение и запись CSV-файлов в GolangРабота с cookie в GolangРегистры в GoКэширование данных в GolangПреобразование byte в string в GolangByte в GoИспользование bufio для работы с потоками данных в GolangДобавление данных и элементов (add) в Go
Логирование в Golang. Zap, Logrus, Loki, GrafanaРабота с Docker-контейнерами в GoИспользование pprof в GolangМеханизмы синхронизации в GolangРабота с пакетом S3 в GolangМониторинг Golang приложений с помощью PrometheusОптимизация проектов на GoПаттерны проектирования в GolangМиграции базы данных в GolangОркестрация контейнеров Go с Kubernetes + DockerGjGo Playground и компилятор GolangИспользование go mod init для создания модулей GolangРабота с переменными окружения (env) в GolangКоманда go build в GolangАвтоматизация Golang проектов — CI/CD с GitLab CI и JenkinsОтладка кода в GolangЧтение и использование конфигурации в приложениях на GolangКомпиляция в GolangКак развернуть Go-приложение на облаке AWSАутентификация в Golang
Сетевые протоколы в GoПеременные в GolangЗначения в GolangДженерик %T и его применение в GolangТипы данных в GolangИспользование tls в GolangИспользование tag в структурах GolangSwitch в GoСтроки в GolangРабота с потоками (stream) в GolangSelect в GoРуны в GoРабота с пакетом params в GolangКонвертация строк в числа в GolangNull, Nil, None, 0 в GoНаименования переменных, функций и структур в GoInt в GolangУстановка GolangЧтение и установка HTTP заголовков в GolangMethods в GolangGoLand — IDE для разработки на Golang от JetBrainsОбработка «not found» в GolangFloat в GolangФлаги командной строки в Go (Golang)Запуск внешних команд в GolangОбработка ошибок в GoИспользование defer в GolangЗначения default в GolangГенерация кода в GoФорматирование кода в GolangЧистая архитектура в GolangКаналы (channels) в GolangПолучение body из HTTP запроса в Golang
Открыть базу знаний