> Является ли новый слайс после добавления элементов копией или ссылкой в Go (Go)

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

Компании: Ozon

Стек: Go

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

В Go при добавлении элементов через append поведение зависит от ёмкости (capacity) исходного слайса.

Если в слайсе есть свободное место (len < cap), append возвращает ссылку на тот же базовый массив - новый слайс разделяет память с исходным. Изменения элементов отразятся в обоих.

Если свободного места нет (len == cap), append выделяет новый массив большего размера, копирует в него старые элементы и добавляет новые. В этом случае возвращается копия - новый слайс с независимым массивом. Исходный слайс остаётся неизменным.

Пример:

GO
s := make([]int, 2, 4) // len=2, cap=4
s[0], s[1] = 1, 2
s2 := append(s, 3) // ссылка - cap позволяет
s[0] = 100
fmt.Println(s2[0]) // 100 - изменения видны
s3 := append(s2, 4, 5) // cap=4, len=4 → новый массив
s2[1] = 200
fmt.Println(s3[1]) // 2 - независимая копия

Итог: новый слайс может быть как ссылкой (при наличии ёмкости), так и копией (при превышении ёмкости). Для гарантии независимости используйте copy или явное выделение памяти.

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

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