Sobes.tech
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)