Back to questions
Senior
1
Если я работаю со слайсом, взял его как параметр функции, что-то с ним делаю и продолжаю после функции дальше с ним работать — о чём нужно помнить? Какие изменения мы не увидим снаружи?
Companies where asked
Магнум
Answer from AI
sobes.tech 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, срезы) — нет, если не вернуть новый слайс или не передать указатель на слайс.