Junior
Каква е основната разлика между slices и масиви в Go?
sobes.tech AI
Отговор от AI
Slices са динамично променящи се изгледи към масиви.
| Характеристика | Масив (Array) | Slice |
|---|---|---|
| Размер | Фиксиран, определя се при създаване | Динамичен, може да се променя |
| Тип | [n]T (където n е размерът, T е типът) |
[]T (където T е типът) |
| Передаване към функции | По стойност (копие) | По референция към подлежащия масив, се предават 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) |
| Производителност | По-прогнозируема поради фиксирания размер, може да е по-ефективна при малки размери | Може да има разходи при промяна на размера (преразпределение на подлежащия масив) |
// Пример за масив
var arr [3]int = [3]int{1, 2, 3}
// Пример със slice, създаден от масив
slice := arr[1:] // slice {2, 3}
// Пример за създаване на slice
s := []int{10, 20, 30} // подлежащ масив {10, 20, 30}, дължина = 3, капацитет = 3
// Промяна на slice
s = append(s, 40) // сега s {10, 20, 30, 40}. Ако капацитетът не е достатъчен, ще се създаде нов подлежащ масив, дължина = 4, капацитет = 6 (обикновено удвояване)
// Промяна на елемент в slice променя подлежащия масив
slice[0] = 99 // arr сега {1, 99, 3}
fmt.Println(arr)