Что такое len и capacity в slice Go

Слайсы имеют две основные характеристики: длину (`len`) и емкость (`capacity`). Понимание этих характеристик важно для эффективного использования слайсов. Давайте рассмотрим, что такое длина и емкость слайса, как они работают и как их использовать.

Длина (`len`)

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

Пример:

```go
package main

import "fmt"

func main() {
    slice := []int{1, 2, 3, 4, 5}
    fmt.Println("Length:", len(slice)) // Length: 5
}
```

Емкость (`capacity`)Это максимальное количество элементов, которые слайс может содержать без выделения дополнительной памяти. Емкость всегда больше или равна длине слайса.

```go
package main

import "fmt"

func main() {
    slice := make([]int, 3, 5)
    fmt.Println("Length:", len(slice))   // Length: 3
    fmt.Println("Capacity:", cap(slice)) // Capacity: 5
}
```

Взаимосвязь длины и емкости

1. Длина (`len`):

  • Определяет текущее количество элементов в слайсе.
  • Используется для операций чтения и записи.

2. Емкость (`cap`):

  • Определяет максимальное количество элементов, которые могут быть добавлены в слайс без выделения новой памяти.
  • Емкость может увеличиваться автоматически при добавлении элементов через функцию `append`.

Использование `append`

Когда вы добавляете элементы в слайс с помощью `append`, если текущей емкости недостаточно, автоматически выделяет новый массив с большей емкостью, копирует существующие элементы в новый массив и добавляет новые элементы.

```go
package main

import "fmt"

func main() {
    slice := make([]int, 2, 2)
    slice[0] = 1
    slice[1] = 2

    fmt.Println("Before append:", slice, "Len:", len(slice), "Cap:", cap(slice)) // [1 2] Len: 2 Cap: 2

    // Добавляем элемент, превышающий текущую емкость
    slice = append(slice, 3)

    fmt.Println("After append:", slice, "Len:", len(slice), "Cap:", cap(slice)) // [1 2 3] Len: 3 Cap: 4
}
```

Полная форма нарезки (full slice expression)

Позволяет задать начальный индекс, конечный индекс и емкость нового слайса.

```go
package main

import "fmt"

func main() {
    original := []int{1, 2, 3, 4, 5}
    newSlice := original[1:3:4]
    fmt.Println("New Slice:", newSlice)       // [2 3]
    fmt.Println("Length:", len(newSlice))     // 2
    fmt.Println("Capacity:", cap(newSlice))   // 3
}
```

Слайсы имеют две важные характеристики: длину (`len`) и емкость (`cap`). Длина указывает на текущее количество элементов в слайсе, а емкость — на максимальное количество элементов, которое слайс может содержать без выделения новой памяти. Эти характеристики позволяют эффективно управлять памятью и использовать слайсы для динамической работы с данными.

July 1, 2024, easyoffer

Примеры ответов: