Что такое 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