Sobes.tech
Назад к вопросам
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 внутри функции не изменил исходный слайс

Важно понимать, когда происходит копирование массива, а когда — только структуры слайса.