Sobes.tech
Junior

Kuidas töötada slices'idega Go-s?

sobes.tech AI

Vastus AI-lt

Go-slaidid ei ole massiivid, vaid viitavad segmentile (või kogu) põhimassiivist. Need on dünaamilised andmestruktuurid.

Slaidi loomine:

  • Massiivist:
    // massiivi määratlus
    arr := [5]int{1, 2, 3, 4, 5}
    // osa massiivist slaidi loomine
    s1 := arr[1:4] // s1 sisaldab elemente arr[1], arr[2], arr[3]
    s2 := arr[:3]  // s2 sisaldab elemente arr[0], arr[1], arr[2]
    s3 := arr[2:]  // s3 sisaldab elemente arr[2], arr[3], arr[4]
    s4 := arr[:]   // s4 viitab kogu massiivile
    
  • make abil:
    // Loo slaid pikkusega 5 ja mahutavusega 5
    s := make([]int, 5)
    // Loo slaid pikkusega 5 ja mahutavusega 10
    s_cap := make([]int, 5, 10)
    
  • Literali abil:
    s := []int{1, 2, 3}
    

Slaidi põhiväärtused:

  • len(s): tagastab slaidi praeguse pikkuse.
  • cap(s): tagastab slaidi mahutavuse (maksimaalne elementide arv, mis võib olla salvestatud enne reallocationi).

Elementide lisamine (append):

s := []int{1, 2}
s = append(s, 3)      // lisab ühe elemendi
s = append(s, 4, 5)   // lisab mitu elementi
s2 := []int{6, 7}
s = append(s, s2...) // lisab teise slaidi elemente

append võib põhjustada põhimassiivi reallocation, kui mahutavus ei ole piisav.

Elementide eemaldamine:

Elementide eemaldamine slaidist saavutatakse uue slaidi loomisega ülejäänud elementidest või kopeerimisega:

s := []int{1, 2, 3, 4, 5}
// Elementi eemaldamine indeksi i järgi
i := 2 // eemaldame elemendi indeksiga 2 (st 3)
s = append(s[:i], s[i+1:]...)

Slaidide kopeerimine:

src := []int{1, 2, 3}
dst := make([]int, len(src))
copy(dst, src) // kopeerib elemente src-st dst-sse

copy kopeerib minimaalse pikkuse kahe slaidi vahel.

Iteratsioon slaidil:

s := []string{"a", "b", "c"}
for i, v := range s {
    // i - indeks, v - väärtus
}
for i := range s {
    // ainult indeks
}
for _, v := range s {
    // ainult väärtus
}

Slaidid on viiteliigid:

Slaidide muutused kajastuvad põhimassiivis ja teistes slaidides, mis viitavad sama mälu piirkonnale:

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
// Nüüd arr: [1, 99, 3, 4, 5]
// s1: [99, 3, 4]
// s2: [3, 4, 5] (element arr[2] muutus)