> Когда происходит копирование элементов при передаче массива или слайса в функцию в Go (Go)
Уровень: senior · Роль: backend · Категория: Технические вопросы
Компании: Wildberries, Avito
Стек: Go
> Пример ответа
В Go при передаче массива в функцию происходит копирование всего массива целиком. Массив - это значение, поэтому функция получает полную копию всех его элементов. Любые изменения внутри функции не повлияют на исходный массив.
Пример:
GOfunc modify(arr [3]int) {arr[0] = 100 // меняем копию}func main() {original := [3]int{1, 2, 3}modify(original)fmt.Println(original) // [1 2 3] - без изменений}
При передаче слайса копируется только заголовок слайса (структура из указателя на массив, длины и ёмкости). Сами элементы массива не копируются. Поэтому изменения элементов слайса внутри функции видны снаружи, но изменение длины/ёмкости (через append) может потребовать возврата нового слайса.
Пример:
GOfunc 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() или при передаче по значению в контексте, где требуется полная независимость данных.
> Похожие задачи по backend
Для чего используются NoSQL решения?
Как используется WaitGroup для ожидания завершения горутин в Go
Где в памяти живут глобальные переменные в Go?
Какую функцию выполняет транзакция
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью