Junior
Koja je ključna razlika između slices i nizova u Go?
sobes.tech АИ
Одговор од АИ
Sličevi su dinamički promenjivi prikazi nizova.
| Karakteristika | Niz (Array) | Sličevi (Slice) |
|---|---|---|
| Veličina | Fiksna, određuje se pri kreiranju | Dinamička, može se menjati |
| Tip | [n]T (gde je n veličina, T tip) |
[]T (gde je T tip) |
| Prenos u funkcije | Po vrednosti (kopija) | Po referenci na osnovni niz, prenose se head, len i cap (u stvari, kreira se nova struktura SliceHeader sa kopijama ovih polja) |
| Kreiranje | var a [5]int ili b := [3]string{"a", "b", "c"} |
var s []int ili t := []int{1, 2, 3} ili u := make([]int, 5) |
| Performanse | Predvidljivije zbog fiksne veličine, može biti efikasnije za manje veličine | Može imati troškove pri promeni veličine (re- alokacija osnovnog niza) |
// Primer niza
var arr [3]int = [3]int{1, 2, 3}
// Primer sa slice-om napravljenim od niza
slice := arr[1:] // slice {2, 3}
// Primer za kreiranje slice-a
s := []int{10, 20, 30} // osnovni niz {10, 20, 30}, dužina = 3, kapacitet = 3
// Izmena slice-a
s = append(s, 40) // sada s {10, 20, 30, 40}. Ako kapacitet nije dovoljan, kreiraće se novi osnovni niz, dužina = 4, kapacitet = 6 (obično dupliranje kapaciteta).
// Izmena elementa u slice-u menja osnovni niz
slice[0] = 99 // arr sada {1, 99, 3}
fmt.Println(arr)