Назад к вопросам
Junior
113
questionbank
В чем ключевое различие между слайсами и массивами в Go?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Слайсы — это динамически изменяемые представления массивов.
| Характеристика | Массив (Array) | Слайс (Slice) |
|---|---|---|
| Размер | Фиксированный, определяется при создании | Динамический, может изменяться |
| Тип | [n]T (где n - размер, T - тип) |
[]T (где T - тип) |
| Передача в функции | По значению (копия) | По ссылке на underlying array, передаются head, len и cap (фактически, создается новая структура SliceHeader с копиями этих полей) |
| Создание | var a [5]int или b := [3]string{"a", "b", "c"} |
var s []int или t := []int{1, 2, 3} или u := make([]int, 5) |
| Производительность | Более предсказуемая производительность из-за фиксированного размера, может выигрывать при небольших размерах | Может иметь накладные расходы при изменении размера (перевыделение underlying array) |
// Пример массива
var arr [3]int = [3]int{1, 2, 3}
// Пример слайса, созданного из массива
slice := arr[1:] // slice {2, 3}
// Пример создания слайса
s := []int{10, 20, 30} // underlying array {10, 20, 30}, len = 3, cap = 3
// Изменение слайса
s = append(s, 40) // теперь s {10, 20, 30, 40}. В случае нехватки capacities создастся новый underlying array.len = 4, cap = 6 (обычно удваивание capacities).
// Изменение элемента слайса изменяет underlying array
slice[0] = 99 // arr теперь {1, 99, 3}
fmt.Println(arr)