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

Ответ

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

package main

import "fmt"

func main() {
    s := []int{10, 20, 30}
    fmt.Println(len(s)) // Выведет: 3

    var nilSlice []int
    fmt.Println(len(nilSlice)) // Выведет: 0
}

Ключевые моменты:

  1. Длина (len) vs. Емкость (cap):

    • len() — это количество элементов, которые фактически находятся в слайсе.
    • cap() — это емкость, то есть количество элементов, которые могут быть помещены в базовый массив слайса без нового выделения памяти. Длина не может превышать емкость (len <= cap).
    // Создаем слайс с длиной 3 и емкостью 5
    s := make([]int, 3, 5)
    fmt.Println(len(s)) // 3
    fmt.Println(cap(s)) // 5
    
    s = append(s, 40)   // Добавляем элемент
    fmt.Println(len(s)) // 4
    fmt.Println(cap(s)) // 5 (емкость не изменилась)
  2. Сложность: Вызов len() и cap() имеет сложность O(1), так как эти значения хранятся в заголовке слайса и доступны напрямую.

  3. Nil-слайс: Для nil-слайса и len(), и cap() вернут 0.

  4. Массивы: Функция len() также применима к массивам, но для них len всегда равен cap, так как размер массива фиксирован.