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