Влияние функции на переданный слайс

Комментарий в условии неточен: длина исходного среза остаётся 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) }, а вызывающий код — присвоить результат. Для независимого массива нужна явная копия.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее