> Является ли новый слайс после добавления элементов копией или ссылкой в Go (Go)
Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы
Компании: Ozon
Стек: Go
> Пример ответа
В Go при добавлении элементов через append поведение зависит от ёмкости (capacity) исходного слайса.
Если в слайсе есть свободное место (len < cap), append возвращает ссылку на тот же базовый массив - новый слайс разделяет память с исходным. Изменения элементов отразятся в обоих.
Если свободного места нет (len == cap), append выделяет новый массив большего размера, копирует в него старые элементы и добавляет новые. В этом случае возвращается копия - новый слайс с независимым массивом. Исходный слайс остаётся неизменным.
Пример:
GOs := make([]int, 2, 4) // len=2, cap=4s[0], s[1] = 1, 2s2 := append(s, 3) // ссылка - cap позволяетs[0] = 100fmt.Println(s2[0]) // 100 - изменения видныs3 := append(s2, 4, 5) // cap=4, len=4 → новый массивs2[1] = 200fmt.Println(s3[1]) // 2 - независимая копия
Итог: новый слайс может быть как ссылкой (при наличии ёмкости), так и копией (при превышении ёмкости). Для гарантии независимости используйте copy или явное выделение памяти.
> Похожие задачи по Go
Какие алгоритмы балансировки подходят для распределенных систем без синхронизации
Для чего используется рефлексия в Go
Можно ли внутри контейнера поднять другую операционную систему
Когда очищается память массива под слайсом в Go
> Похожие задачи по backend
Какие алгоритмы балансировки подходят для распределенных систем без синхронизации
Для чего используется рефлексия в Go
Можно ли внутри контейнера поднять другую операционную систему
Когда очищается память массива под слайсом в Go
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью