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) — не, ако не върнете нов слайс или не предадете указател към слайса.