Sobes.tech
Junior

Aký je kľúčový rozdiel medzi slices a poliami v Go?

sobes.tech AI

Odpoveď od AI

Slicing sú dynamicky meniteľné pohľady na polia.

Charakteristika Pole (Array) Slicing (Slice)
Veľkosť Fixná, určená pri vytvorení Dynamická, môže sa meniť
Typ [n]T (kde n je veľkosť, T je typ) []T (kde T je typ)
Prenos do funkcií Podľa hodnoty (kópia) Podľa odkazu na podkladové pole, sa odovzdávajú head, len a cap (v skutočnosti, sa vytvorí nová štruktúra SliceHeader s kópiami týchto polí)
Vytvorenie var a [5]int alebo b := [3]string{"a", "b", "c"} var s []int alebo t := []int{1, 2, 3} alebo u := make([]int, 5)
Výkon Predvídateľnejší kvôli pevnej veľkosti, môže byť efektívnejší pri malých veľkostiach Môže mať režiu pri zmene veľkosti (prealokácia podkladového poľa)
// Príklad poľa
var arr [3]int = [3]int{1, 2, 3}

// Príklad slice vytvoreného z poľa
slice := arr[1:] // slice {2, 3}

// Príklad vytvorenia slice
s := []int{10, 20, 30} // podkladové pole {10, 20, 30}, dĺžka = 3, kapacita = 3

// Zmena slice
s = append(s, 40) // teraz s {10, 20, 30, 40}. Ak kapacita nestačí, vytvorí sa nové podkladové pole, dĺžka = 4, kapacita = 6 (zvyčajne zdvojnásobenie kapacity).

// Zmena prvku v slice mení podkladové pole
slice[0] = 99 // arr teraz {1, 99, 3}
fmt.Println(arr)