Junior
Jak pracovat se slices v Go?
sobes.tech AI
Odpověď od AI
Slicy v Go nejsou pole, ale odkazují na segment (nebo celý) základního pole. Jsou to dynamické datové struktury.
Vytváření sliců:
- Z pole:
// definice pole
arr := [5]int{1, 2, 3, 4, 5}
// vytvoření slicu z části pole
s1 := arr[1:4] // s1 obsahuje prvky arr[1], arr[2], arr[3]
// vytvoření jiného slicu
s2 := arr[:3] // s2 obsahuje prvky arr[0], arr[1], arr[2]
// slic, který odkazuje na celý pole
s3 := arr[2:] // s3 obsahuje prvky arr[2], arr[3], arr[4]
// slic, který odkazuje na celý pole
s4 := arr[:]
- Pomocí
make:
// Vytvoření slicu s délkou 5 a kapacitou 5
s := make([]int, 5)
// Vytvoření slicu s délkou 5 a kapacitou 10
s_cap := make([]int, 5, 10)
- Literál:
s := []int{1, 2, 3}
Hlavní vlastnosti slicu:
len(s): vrací aktuální délku slicu.cap(s): vrací kapacitu slicu (maximální počet prvků, které může obsahovat před re-allokací).
Přidání prvků (append):
s := []int{1, 2}
s = append(s, 3) // přidá jeden prvek
s = append(s, 4, 5) // přidá více prvků
s2 := []int{6, 7}
s = append(s, s2...) // přidá prvky jiného slicu
append může způsobit re-allokaci základního pole, pokud kapacita nestačí.
Odstranění prvků:
Odstranění prvků ze slicu se provádí vytvořením nového slicu s zbývajícími prvky nebo kopírováním.
s := []int{1, 2, 3, 4, 5}
// Odstranění prvku na indexu i
i := 2 // odstraníme prvek na indexu 2 (tedy 3)
s = append(s[:i], s[i+1:]...)
Kopírování sliců:
src := []int{1, 2, 3}
dst := make([]int, len(src))
copy(dst, src) // zkopíruje prvky ze src do dst
copy kopíruje minimální délku ze dvou sliců.
Iterace přes slice:
s := []string{"a", "b", "c"}
for i, v := range s {
// i - index, v - hodnota
}
for i := range s {
// pouze index
}
for _, v := range s {
// pouze hodnota
}
Slicy jsou referenční typy:
Změny v slicu se odrážejí v základním poli a v jiných slicích odkazujících na stejnou oblast paměti.
arr := [5]int{1, 2, 3, 4, 5}
s1 := arr[1:4] // [2, 3, 4]
s2 := arr[2:5] // [3, 4, 5]
s1[0] = 99
// Nyní arr: [1, 99, 3, 4, 5]
// s1: [99, 3, 4]
// s2: [3, 4, 5] (prvek arr[2] se změnil)