Sobes.tech
Назад к вопросам
Senior
3

Если я работаю со слайсом, взял его как параметр функции, что-то с ним делаю и продолжаю после функции дальше с ним работать — о чём нужно помнить? Какие изменения мы не увидим снаружи?

Компании, где спрашивали
Магнум

Ответ от нейросети

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