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

Len и Cap в Golang

Автор

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

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

Функция len()

Функция len() в Go возвращает количество элементов в коллекции. Эта функция применяется к массивам, срезам, строкам и картам. Давайте рассмотрим примеры использования функции len():

  1. Массивы

    Для массивов функция len() возвращает фиксированное количество элементов:

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

    Здесь len(nums) возвращает значение 5, так как массив nums содержит пять элементов.

  2. Срезы

    Для срезов функция len() также возвращает количество элементов, содержащихся в срезе:

    package main
    
    import "fmt"
    
    func main() {
        nums := []int{10, 20, 30, 40, 50}
        fmt.Println("Длина среза:", len(nums)) // Вывод: 5
    }

    В этом примере срез nums также имеет длину 5.

  3. Строки

    Для строк функция len() возвращает количество байтов в строке:

    package main
    
    import "fmt"
    
    func main() {
        str := "Привет"
        fmt.Println("Длина строки:", len(str)) // Вывод: 12 (так как каждый символ занимает несколько байт)
    }

    Здесь len(str) возвращает 12, так как строка кодируется в UTF-8 и каждый символ может занимать больше одного байта.

Функция cap()

Функция cap() возвращает емкость коллекции, то есть максимальное количество элементов, которые могут быть размещены в этой коллекции. Эта функция используется для массивов, срезов и каналов.

  1. Массивы

    Для массивов емкость всегда равна их длине, так как массивы имеют фиксированный размер:

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

    Для срезов емкость — это количество элементов от начала среза до конца базового массива. Рассмотрим пример:

    package main
    
    import "fmt"
    
    func main() {
        nums := []int{10, 20, 30, 40, 50}
        subSlice := nums[1:4]
        fmt.Println("Длина subSlice:", len(subSlice)) // Вывод: 3
        fmt.Println("Емкость subSlice:", cap(subSlice)) // Вывод: 4
    }

    В этом примере длина subSlice равна 3, так как он содержит элементы с индексами 1, 2 и 3 из массива nums. Емкость subSlice равна 4, так как она включает все элементы от nums[1] до nums[4].

Различия между len() и cap()

  • len() возвращает количество элементов в коллекции, которые в данный момент доступны.
  • cap() возвращает общую емкость коллекции, то есть максимальное количество элементов, которое коллекция может содержать без расширения.

Применение len() и cap() в практике

Функции len() и cap() часто используются при работе с динамическими данными, чтобы отслеживать размеры коллекций и при необходимости управлять ими. Например, функция append() для добавления элементов в срез может увеличивать его емкость, если она не достаточна для размещения новых данных.

Заключение

Функции len() и cap() в Go являются важными инструментами для работы с коллекциями данных. len() позволяет определить количество элементов, а cap() — емкость среза или массива. Эти функции помогают эффективно управлять данными и понимать структуру коллекций в Go. В следующей статье мы подробнее рассмотрим, как изменять и расширять срезы в Go для более гибкой работы с данными.

Стрелочка влевоФункция make в GoОбъединение массивов и строк (join) в 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
Открыть базу знаний