Sobes.tech
Junior

Как да работите със слайсове в Go?

sobes.tech AI

Отговор от AI

Слайсовете в 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[:]
  • С помощта на 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] се е променил)