Проверяет понимание разницы между длиной и ёмкостью слайса в Go, что важно для эффективного управления памятью.
В Go слайс — это динамическая структура данных, которая предоставляет удобный интерфейс для работы с последовательностями элементов. Каждый слайс имеет два ключевых свойства: длину (len) и ёмкость (cap). Длина — это количество элементов, которые в данный момент хранятся в слайсе. Ёмкость — это размер внутреннего массива, на который ссылается слайс, то есть максимальное количество элементов, которое можно разместить без выделения новой памяти.
Когда вы создаёте слайс с помощью make или среза массива, Go выделяет под него массив фиксированного размера. Например, make([]int, 3, 5) создаёт слайс длины 3 и ёмкости 5. Это значит, что вы можете добавить до 2 элементов через append без перераспределения. Если вы попытаетесь добавить больше, Go создаст новый массив большего размера (обычно удваивая ёмкость) и скопирует туда все элементы.
package main
import "fmt"
func main() {
// Создаём слайс с длиной 3 и ёмкостью 5
s := make([]int, 3, 5)
fmt.Println(len(s), cap(s)) // 3 5
// Добавляем элементы
s = append(s, 1, 2)
fmt.Println(len(s), cap(s)) // 5 5
// Добавляем ещё один — ёмкость увеличивается
s = append(s, 3)
fmt.Println(len(s), cap(s)) // 6 10 (ёмкость удвоилась)
}Понимание разницы между len и cap критично для оптимизации производительности. Если вы заранее знаете, сколько элементов будет добавлено, лучше указать ёмкость при создании слайса, чтобы избежать многократного перераспределения памяти. Это особенно важно в циклах или при работе с большими объёмами данных.
Также стоит помнить, что при срезе слайса новый слайс может ссылаться на тот же внутренний массив, что и исходный. Это может привести к неожиданному изменению данных, если вы измените элементы в одном из слайсов.
Используйте len для получения текущего количества элементов и cap для оценки доступного пространства. Указывайте ёмкость при создании слайса, если знаете примерный размер, чтобы повысить эффективность работы с памятью в Go.