Sobes.tech
Senior

Какво е слайс? Какво е под капака на слайса? Как работи функцията append?

sobes.tech AI

Отговор от AI

В Go, слайсът е динамичен масив, който представлява структура с три полета:

  • Посочвач към масива (подлежащият масив в паметта)
  • Дължина (len) — броят на елементите, достъпни в слайса
  • Капацитет (cap) — максималният брой елементи, които подлежащият масив може да съдържа, започвайки от посочвача

Зад сцената, слайсът е малка структура, приблизително така:

type sliceHeader struct {
    Data uintptr // посочвач към първия елемент на масива
    Len  int
    Cap  int
}

Функцията append добавя елементи към слайса. Ако дължината на слайса е по-малка от капацитета, append просто записва новите елементи в подлежащия масив и увеличава дължината. Ако дължината достигне капацитета, append заделя нов масив с по-голям капацитет (обикновено два пъти по-голям), копира старите елементи, добавя новите и връща нов слайс с актуализиран посочвач.

Пример:

s := []int{1, 2, 3}
s = append(s, 4) // ако cap(s) > len(s), просто добавя 4

// ако cap(s) == len(s), заделя нов масив, копира [1,2,3], добавя 4

По този начин, append може да връща нов слайс, и е важно да присвоявате резултата отново.