> Когда происходит копирование элементов при передаче массива или слайса в функцию в Go (Go)

Уровень: senior · Роль: backend · Категория: Технические вопросы

Компании: Wildberries, Avito

Стек: Go

> Пример ответа

В Go при передаче массива в функцию происходит копирование всего массива целиком. Массив - это значение, поэтому функция получает полную копию всех его элементов. Любые изменения внутри функции не повлияют на исходный массив.

Пример:

GO
func modify(arr [3]int) {
arr[0] = 100 // меняем копию
}
func main() {
original := [3]int{1, 2, 3}
modify(original)
fmt.Println(original) // [1 2 3] - без изменений
}

При передаче слайса копируется только заголовок слайса (структура из указателя на массив, длины и ёмкости). Сами элементы массива не копируются. Поэтому изменения элементов слайса внутри функции видны снаружи, но изменение длины/ёмкости (через append) может потребовать возврата нового слайса.

Пример:

GO
func modifySlice(s []int) {
s[0] = 100 // меняет исходный массив
s = append(s, 4) // создаёт новый массив, если ёмкость превышена
}
func main() {
slice := []int{1, 2, 3}
modifySlice(slice)
fmt.Println(slice) // [100 2 3] - изменение видно, append не повлиял
}

Ключевой момент: копирование элементов происходит только для массивов (всегда) и для слайсов - только если явно сделать копию через copy() или при передаче по значению в контексте, где требуется полная независимость данных.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью