Sobes.tech
Junior

Ako pracovať so slices v Go?

sobes.tech AI

Odpoveď od AI

V Go sú podely nie sú polia, ale odkazujú na segment (alebo celý) základného poľa. Sú to dynamické dátové štruktúry.

Vytváranie podelov:

  • Z poľa:
    // definujeme pole
    arr := [5]int{1, 2, 3, 4, 5}
    // vytvárame podel z časti poľa
    s1 := arr[1:4] // s1 obsahuje prvky arr[1], arr[2], arr[3]
    s2 := arr[:3]  // s2 obsahuje prvky arr[0], arr[1], arr[2]
    s3 := arr[2:]  // s3 obsahuje prvky arr[2], arr[3], arr[4]
    s4 := arr[:]   // s4 odkazuje na celé pole
    
  • Pomocou make:
    // Vytvorenie podelu s dĺžkou 5 a kapacitou 5
    s := make([]int, 5)
    // Vytvorenie podelu s dĺžkou 5 a kapacitou 10
    s_cap := make([]int, 5, 10)
    
  • Literálom:
    s := []int{1, 2, 3}
    

Hlavné vlastnosti podelov:

  • len(s): vracia aktuálnu dĺžku podelu.
  • cap(s): vracia kapacitu podelu (maximálny počet prvkov, ktorý môže byť obsiahnutý pred reallokáciou).

Pridávanie prvkov (append):

s := []int{1, 2}
s = append(s, 3)      // pridáva jeden prvok
s = append(s, 4, 5)   // pridáva viac prvkov
s2 := []int{6, 7}
s = append(s, s2...) // pridáva prvky iného podelu

append môže spôsobiť reallokáciu základného poľa, ak kapacity nie sú dostatočné.

Odstraňovanie prvkov:

Odstraňovanie prvkov z podelu sa dosahuje vytvorením nového podelu z zostávajúcich prvkov alebo kopírovaním.

s := []int{1, 2, 3, 4, 5}
// Odstránenie prvku podľa indexu i
i := 2 // odstraňujeme prvok s indexom 2 (t.j. 3)
s = append(s[:i], s[i+1:]...)

Kopírovanie podelov:

src := []int{1, 2, 3}
dst := make([]int, len(src))
copy(dst, src) // kopíruje prvky zo src do dst

copy kopíruje minimum z dĺžky dvoch podelov.

Iterácia podelov:

s := []string{"a", "b", "c"}
for i, v := range s {
    // i - index, v - hodnota
}
for i := range s {
    // len len
}
for _, v := range s {
    // len hodnotu
}

Podely sú referenčné typy:

Zmeny v podelu sa odrážajú na základnom poli a iných podeloch odkazujúcich na rovnakú oblasť 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
// Teraz arr: [1, 99, 3, 4, 5]
// s1: [99, 3, 4]
// s2: [3, 4, 5] (prvok arr[2] sa zmenil)