Sobes.tech
Junior

Kako raditi sa slices u Go?

sobes.tech АИ

Одговор од АИ

Слайсови у Go-у нису низови, већ се односе на сегмент (или цео) основне низе. Ово су динамичке структуре података.

Креирање слайса:

  • Из низе:
    // дефинишемо низ
    arr := [5]int{1, 2, 3, 4, 5}
    // креирамо слайс из дела низа
    s1 := arr[1:4] // s1 садржи елементе arr[1], arr[2], arr[3]
    s2 := arr[:3]  // s2 садржи елементе arr[0], arr[1], arr[2]
    s3 := arr[2:]  // s3 садржи елементе arr[2], arr[3], arr[4]
    s4 := arr[:]   // s4 се односи на цео низ
    
  • Помоћу make:
    // Креирање слайса дужине 5 и капацитета 5
    s := make([]int, 5)
    // Креирање слайса дужине 5 и капацитета 10
    s_cap := make([]int, 5, 10)
    
  • Литералом:
    s := []int{1, 2, 3}
    

Основна својства слайса:

  • len(s): враћа тренутну дужину слайса.
  • cap(s): враћа капацитет слайса (максимални број елемената који може бити садржан пре реалокације).

Додавање елемената (append):

s := []int{1, 2}
s = append(s, 3)      // додаје један елемент
s = append(s, 4, 5)   // додаје више елемената
s2 := []int{6, 7}
s = append(s, s2...) // додаје елементе другог слайса

append може изазвати реалокацију основне низе ако капацитети нису довољни.

Уклањање елемената:

Уклањање елемената из слайса се постиже кроз креирање новог слайса од преосталих елемената или копирањем.

s := []int{1, 2, 3, 4, 5}
// Уклањање елемента по индексу i
i := 2 // уклањамо елемент по индексу 2 (тј. 3)
s = append(s[:i], s[i+1:]...)

Копирање слайса:

src := []int{1, 2, 3}
dst := make([]int, len(src))
copy(dst, src) // копира елементе из src у dst

copy копира минимум од дужина два слайса.

Итерација кроз слайс:

s := []string{"a", "b", "c"}
for i, v := range s {
    // i - индекс, v - вредност
}
for i := range s {
    // само индекс
}
for _, v := range s {
    // само вредност
}

Слайсови су референтни типови:

Промене у слайсу се одражавају на основну низу и другим слайсевима који се односе на исту област меморије.

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
// Сада arr: [1, 99, 3, 4, 5]
// s1: [99, 3, 4]
// s2: [3, 4, 5] (елемент arr[2] се промени)