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)