Назад к вопросам
МВидео
Middle+
3
Какая опасность при передаче слайса в функцию? Есть ли подковырка с массивами?
Компании, где спрашивали
Ответ от нейросети
sobes.tech AI
При передаче слайса в функцию в Go передается не копия всего массива, а структура слайса, которая содержит указатель на массив, длину и ёмкость. Это значит, что изменения элементов слайса внутри функции отражаются на исходном массиве.
Опасность:
- Если функция изменяет элементы слайса, это повлияет на исходные данные.
- Если функция расширяет слайс (append), и при этом происходит перераспределение памяти (capacity увеличивается), то новый слайс указывает на новый массив, и изменения уже не затрагивают исходный массив.
Подковырка с массивами:
- Массивы в Go передаются по значению (копируются полностью), поэтому изменения внутри функции не влияют на оригинал.
- Слайсы — это «обертки» над массивами, передаются по значению, но содержат указатель на массив.
Пример:
func modifySlice(s []int) {
s[0] = 100 // изменит исходный массив
s = append(s, 200) // может создать новый массив, не влияя на исходный
}
arr := []int{1, 2, 3}
modifySlice(arr)
// arr теперь [100, 2, 3], но append внутри функции не изменил исходный слайс
Важно понимать, когда происходит копирование массива, а когда — только структуры слайса.