Junior
Mi a fő különbség a szeletek és a tömbök között a Go-ban?
sobes.tech MI
Válasz az MI-től
A szeletek dinamikusan változtatható nézetek a tömbökre.
| Jellemző | Tömb (Array) | Szelet (Slice) |
|---|---|---|
| Méret | Fix, létrehozáskor határozzák meg | Dinamikus, változhat |
| Típus | [n]T (ahol n a méret, T a típus) |
[]T (ahol T a típus) |
| Átadás függvényeknek | Érték szerint (másolat) | A mögöttes array referencia szerint, head, len és cap átadva (valójában, egy új SliceHeader struktúra jön létre ezek másolataival) |
| Létrehozás | var a [5]int vagy b := [3]string{"a", "b", "c"} |
var s []int vagy t := []int{1, 2, 3} vagy u := make([]int, 5) |
| Teljesítmény | Előre jelezhető a fix méret miatt, kisebb méretek esetén előnyös lehet | Költségnövekedés a méretváltoztatásnál (mögöttes array újraallokálása) |
// Array példa
var arr [3]int = [3]int{1, 2, 3}
// Array-ból létrehozott szelet példa
slice := arr[1:] // szelet {2, 3}
// Szelet létrehozás példa
s := []int{10, 20, 30} // mögöttes array {10, 20, 30}, hossz = 3, kapacitás = 3
// Szelet módosítása
s = append(s, 40) // most s {10, 20, 30, 40}. Ha a kapacitás nem elegendő, új array jön létre, hossz = 4, kapacitás = 6 (általában duplázás)
// Egy elem módosítása a szeletben módosítja a mögöttes array-t
slice[0] = 99 // arr most {1, 99, 3}
fmt.Println(arr)