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