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

Создание Slice в Golang

Автор

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

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

Что такое Slice

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

Создание Slice

Существует несколько способов создания среза в Go:

  1. С использованием литерала среза

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

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

    Здесь создается срез nums, содержащий элементы [1, 2, 3, 4, 5].

  2. С использованием функции make

    Функция make позволяет создавать срезы заданной длины и емкости:

    package main
    
    import "fmt"
    
    func main() {
        nums := make([]int, 5) // Срез длиной 5
        fmt.Println(nums) // Вывод: [0 0 0 0 0]
    }

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

  3. Срез из массива

    Можно создать срез на основе существующего массива:

    package main
    
    import "fmt"
    
    func main() {
        arr := [5]int{10, 20, 30, 40, 50}
        slice := arr[1:4] // Срез содержит элементы с индексами от 1 до 3
        fmt.Println(slice) // Вывод: [20 30 40]
    }

    Здесь создается срез slice, который содержит часть элементов массива arr.

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

Срезы имеют два важных свойства: длину и емкость.

  • Длина — это количество элементов в срезе, доступное через функцию len().
  • Емкость — это количество элементов от начала среза до конца базового массива, доступное через функцию cap().

Пример:

package main

import "fmt"

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

    subSlice := nums[1:4]
    fmt.Println("Длина subSlice:", len(subSlice)) // Вывод: 3
    fmt.Println("Емкость subSlice:", cap(subSlice)) // Вывод: 4
}

Добавление элементов в Slice

Для добавления элементов в срез используется встроенная функция append:

package main

import "fmt"

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

Функция append возвращает новый срез, который может быть присвоен обратно переменной. Она позволяет динамически увеличивать размер среза.

Итерация по Slice

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

package main

import "fmt"

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

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

Заключение

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

Стрелочка влевоТаблицы и ассоциативные массивы в GolangФункция make в GoСтрелочка вправо

Все гайды по 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
Открыть базу знаний