Назад к вопросам
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)