Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Golang: Go, slice, len, cap, capacity

Чем отличается len от cap у слайса?

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

Короткий ответ

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

Длинный ответ

Разница между len и cap у слайса в Go

В Go слайс — это динамическая структура данных, которая предоставляет удобный интерфейс для работы с последовательностями элементов. Каждый слайс имеет два ключевых свойства: длину (len) и ёмкость (cap). Длина — это количество элементов, которые в данный момент хранятся в слайсе. Ёмкость — это размер внутреннего массива, на который ссылается слайс, то есть максимальное количество элементов, которое можно разместить без выделения новой памяти.

Как это работает

Когда вы создаёте слайс с помощью make или среза массива, Go выделяет под него массив фиксированного размера. Например, make([]int, 3, 5) создаёт слайс длины 3 и ёмкости 5. Это значит, что вы можете добавить до 2 элементов через append без перераспределения. Если вы попытаетесь добавить больше, Go создаст новый массив большего размера (обычно удваивая ёмкость) и скопирует туда все элементы.

package main

import "fmt"

func main() {
    // Создаём слайс с длиной 3 и ёмкостью 5
    s := make([]int, 3, 5)
    fmt.Println(len(s), cap(s)) // 3 5

    // Добавляем элементы
    s = append(s, 1, 2)
    fmt.Println(len(s), cap(s)) // 5 5

    // Добавляем ещё один — ёмкость увеличивается
    s = append(s, 3)
    fmt.Println(len(s), cap(s)) // 6 10 (ёмкость удвоилась)
}

Практическое применение

Понимание разницы между len и cap критично для оптимизации производительности. Если вы заранее знаете, сколько элементов будет добавлено, лучше указать ёмкость при создании слайса, чтобы избежать многократного перераспределения памяти. Это особенно важно в циклах или при работе с большими объёмами данных.

Также стоит помнить, что при срезе слайса новый слайс может ссылаться на тот же внутренний массив, что и исходный. Это может привести к неожиданному изменению данных, если вы измените элементы в одном из слайсов.

Вывод

Используйте len для получения текущего количества элементов и cap для оценки доступного пространства. Указывайте ёмкость при создании слайса, если знаете примерный размер, чтобы повысить эффективность работы с памятью в Go.

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    3

Навыки

  • Golang

    Golang

Ключевые слова

#Go

#slice

#len

#cap

#capacity

Подпишись на Golang Developer в телеграм

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.