Sobes.tech
Senior

Ако работя със слайс, го взимам като параметър на функция, правя нещо с него и продължавам да работя с него след функцията — за какво трябва да помня? Какви промени няма да видим отвън?

sobes.tech AI

Отговор от AI

В Go слайсът е структура, която съдържа указател към масив, дължина и капацитет. Когато предавате слайс към функция, копира се само тази структура (указател, дължина, капацитет), а не самият масив.

Важно е да запомните:

  • Промените в елементите на слайса вътре във функцията (например, s[0] = 10) ще бъдат видими отвън, тъй като сочат към същия масив.
  • Промените в самата структура на слайса (например, присвояване на нов слайс s = append(s, 5)) няма да повлияят на слайса извън функцията, тъй като се копира само структурата.

Пример:

func modify(s []int) {
    s[0] = 100       // ще промени елемента на масива — ще бъде видимо отвън
    s = append(s, 200) // променя локалната копия на слайса — отвън не се вижда
}

s := []int{1, 2, 3}
modify(s)
fmt.Println(s) // Ще изведе [100 2 3], добавянето на 200 не се отразява

Обобщение: Промените в елементите на слайса са видими отвън, а промените в дължината или капацитета (чрез append, slices) — не, ако не върнете нов слайс или не предадете указател към слайса.