Junior
Jaký je klíčový rozdíl mezi slices a poli v Go?
sobes.tech AI
Odpověď od AI
Slicing je dynamicky měnitelný pohled na pole.
| Charakteristika | Array | Slice |
|---|---|---|
| Velikost | Fixní, určená při vytvoření | Dynamická, může se měnit |
| Typ | [n]T (kde n je velikost, T je typ) |
[]T (kde T je typ) |
| Předání do funkcí | Podle hodnoty (kopie) | Podle odkazu na podkladové pole, předávají se head, len a cap (ve skutečnosti je vytvořena nová struktura SliceHeader s kopiemi těchto polí) |
| Vytvoření | var a [5]int nebo b := [3]string{"a", "b", "c"} |
var s []int nebo t := []int{1, 2, 3} nebo u := make([]int, 5) |
| Výkon | Předvídatelnější díky pevné velikosti, může být výhodnější u malých velikostí | Může mít režii při změně velikosti (přerozdělení podkladového pole) |
// Příklad pole
var arr [3]int = [3]int{1, 2, 3}
// Příklad slice vytvořeného z pole
slice := arr[1:] // slice {2, 3}
// Příklad vytvoření slice
s := []int{10, 20, 30} // podkladové pole {10, 20, 30}, délka = 3, kapacita = 3
// Změna slice
s = append(s, 40) // nyní s {10, 20, 30, 40}. Pokud kapacita nestačí, vytvoří se nové podkladové pole, délka = 4, kapacita = 6 (obvykle zdvojení kapacity).
// Změna prvku ve slice mění podkladové pole
slice[0] = 99 // arr nyní {1, 99, 3}
fmt.Println(arr)