Back to questions
Principal
30
Массивы и слайсы в Go — в чём разница? Как изменяется ёмкость слайса?
Companies where asked
Avosend
Answer from AI
sobes.tech AI
В Go массивы и слайсы — разные типы данных:
-
Массив — фиксированного размера, размер входит в тип, например
[5]int— массив из 5 элементов. Размер массива нельзя изменить после создания. -
Слайс — динамический, представляет собой структуру с указателем на массив, длиной и ёмкостью. Слайс можно расширять, добавляя элементы.
Ёмкость слайса (capacity) — это максимальное количество элементов, которое слайс может вместить без выделения новой памяти.
При добавлении элементов с помощью append:
- Если длина слайса меньше ёмкости, новый элемент просто добавляется.
- Если длина достигает ёмкости, создаётся новый массив с увеличенной ёмкостью (обычно в 2 раза больше), и данные копируются туда.
Пример:
arr := [5]int{1,2,3,4,5} // массив фиксированного размера
slice := arr[1:3] // слайс с длиной 2 и ёмкостью 4
fmt.Println(len(slice)) // 2
fmt.Println(cap(slice)) // 4
slice = append(slice, 10) // добавляем элемент, длина становится 3
fmt.Println(len(slice)) // 3
fmt.Println(cap(slice)) // 4
slice = append(slice, 20, 30) // добавляем ещё 2 элемента, длина 5
fmt.Println(len(slice)) // 5
fmt.Println(cap(slice)) // >=5, ёмкость увеличилась
Таким образом, слайсы удобны для работы с динамическими коллекциями, а массивы — для фиксированных данных.