← Назад к вопросам

Как посчитать длину слайса?

1.0 Junior🔥 161 комментариев
#Основы Go

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как получить длину слайса (среза) в Go

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

Базовый пример использования

package main

import "fmt"

func main() {
    // Создаем слайс целых чисел
    numbers := []int{10, 20, 30, 40, 50}
    
    // Получаем длину слайса с помощью len()
    length := len(numbers)
    
    fmt.Printf("Слайс содержит %d элементов\n", length) // Вывод: Слайс содержит 5 элементов
}

Важные особенности работы с len()

1. len() возвращает количество элементов, а не емкость

Важно различать длину (length) и емкость (capacity) слайса:

  • Длина (length) — текущее количество элементов в слайсе
  • Емкость (capacity) — максимальное количество элементов, которое может вместить слайс без перераспределения памяти
func demonstrateLengthVsCapacity() {
    // Создаем слайс с начальной емкостью 10, но длиной 5
    slice := make([]int, 5, 10)
    
    fmt.Printf("Длина: %d\n", len(slice))     // Вывод: Длина: 5
    fmt.Printf("Емкость: %d\n", cap(slice))   // Вывод: Емкость: 10
}

2. Для пустого слайса len() возвращает 0

func emptySliceExample() {
    var emptySlice []string
    zeroLengthSlice := []int{}
    
    fmt.Println(len(emptySlice))        // 0
    fmt.Println(len(zeroLengthSlice))   // 0
}

3. Динамическое изменение длины

При добавлении элементов с помощью append(), длина слайса увеличивается:

func dynamicLengthExample() {
    slice := []int{1, 2, 3}
    fmt.Println("Начальная длина:", len(slice)) // 3
    
    slice = append(slice, 4, 5)
    fmt.Println("После append:", len(slice))    // 5
    
    // Укорачиваем слайс
    slice = slice[:2]
    fmt.Println("После усечения:", len(slice))  // 2
}

4. len() работает за константное время O(1)

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

// Примерное внутреннее представление (не реальный код)
type sliceHeader struct {
    pointer *byte    // указатель на начало данных
    length  int      // текущая длина
    capacity int     // емкость
}

Практические примеры использования

Итерация по слайсу с использованием len()

func iterateWithLen() {
    fruits := []string{"яблоко", "банан", "апельсин", "груша"}
    
    // Классический цикл for с использованием len()
    for i := 0; i < len(fruits); i++ {
        fmt.Printf("Индекс: %d, Фрукт: %s\n", i, fruits[i])
    }
}

Проверка на пустоту слайса

func checkSliceEmpty() {
    var data []float64
    
    // Правильный способ проверить, пуст ли слайс
    if len(data) == 0 {
        fmt.Println("Слайс пуст")
    }
    
    // НЕПРАВИЛЬНО: проверять на nil, так как слайс может быть ненулевым, но пустым
    initializedEmpty := []float64{}
    if initializedEmpty != nil && len(initializedEmpty) == 0 {
        fmt.Println("Инициализированный пустой слайс")
    }
}

Создание слайсов фиксированной длины

func createFixedLengthSlice() {
    // Создаем слайс длиной 5 (все элементы будут нулевыми значениями)
    fixedSlice := make([]int, 5)
    fmt.Println("Длина после создания:", len(fixedSlice)) // 5
    
    // Можно сразу указать и длину, и емкость
    anotherSlice := make([]string, 3, 10)
    fmt.Printf("Длина: %d, Емкость: %d\n", len(anotherSlice), cap(anotherSlice))
}

Распространенные ошибки и подводные камни

  1. Путаница длины и емкости — помните, что len() возвращает количество элементов, а не максимальный размер.

  2. Изменение длины при срезе (slicing) — при создании среза из существующего слайса длина изменяется:

    original := []int{1, 2, 3, 4, 5}
    subslice := original[1:3]
    fmt.Println(len(subslice)) // 2, а не 5!
    
  3. len() для nil-слайса — функция безопасно работает с nil-слайсами:

    var nilSlice []int
    fmt.Println(len(nilSlice)) // 0, не вызывает панику
    

Заключение

В Go функция len() является основным инструментом для получения длины слайса. Она:

  • Работает за константное время O(1)
  • Безопасна для nil-слайсов (возвращает 0)
  • Возвращает логическую длину (количество элементов), а не емкость
  • Является встроенной функцией языка, поэтому не требует импорта пакетов

Для большинства операций со слайсами — итерации, проверки на пустоту, логики обработки — len() будет вашим основным инструментом наряду с cap() для работы с емкостью.