Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Как получить длину слайса (среза) в 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))
}
Распространенные ошибки и подводные камни
-
Путаница длины и емкости — помните, что
len()возвращает количество элементов, а не максимальный размер. -
Изменение длины при срезе (slicing) — при создании среза из существующего слайса длина изменяется:
original := []int{1, 2, 3, 4, 5} subslice := original[1:3] fmt.Println(len(subslice)) // 2, а не 5! -
len() для nil-слайса — функция безопасно работает с nil-слайсами:
var nilSlice []int fmt.Println(len(nilSlice)) // 0, не вызывает панику
Заключение
В Go функция len() является основным инструментом для получения длины слайса. Она:
- Работает за константное время O(1)
- Безопасна для nil-слайсов (возвращает 0)
- Возвращает логическую длину (количество элементов), а не емкость
- Является встроенной функцией языка, поэтому не требует импорта пакетов
Для большинства операций со слайсами — итерации, проверки на пустоту, логики обработки — len() будет вашим основным инструментом наряду с cap() для работы с емкостью.