Комментарий в условии неточен: длина исходного среза остаётся 1, но общий массив меняется. Через arr[:2] после add видны [1 2].
Влияние функции на переданный слайс
Комментарий в условии неточен: длина исходного среза остаётся 1, но общий массив меняется. Через arr[:2] после add видны [1 2].
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Имеется слайс, созданный с начальной ёмкостью 2. После того как в него добавлен один элемент 1, вызывается функция add() с параметром 2. Вопрос: отразятся ли изменения внутри функции на исходном слайсе.
arr := make([]int, 0, 2) // len 0 cap 2 [ , ]
arr = append(arr, 1) // len = 1 , cap = 2 [1, ]
add(arr, 2) // len = 1 , cap = 2 [1, ] → функция не меняет исходный слайс
func add(arr []int, elem int) {
arr = append(arr, elem) // [1, 2] но это копия
}
В примере показано, что внутри функции создаётся новая копия заголовка слайса, поэтому исходный массив остаётся без изменений.
Ответ
Комментарий в условии неточен: длина исходного среза остаётся 1, но общий массив меняется. Через arr[:2] после add видны [1 2].
Параметр arr получает копию заголовка среза, а не копию массива. Вместимости 2 хватает для append, поэтому число 2 записывается в существующий массив на индекс 1.
Обычный вывод исходного arr покажет [1], потому что его длина не увеличилась. Чтобы вернуть новую длину вызывающей стороне, функция должна возвращать срез: func add(a []int, x int) []int { return append(a, x) }, а вызывающий код — присвоить результат. Для независимого массива нужна явная копия.