Внутри mutate выводится [0 2 3 4 1], после возврата — [0 2 3 4]. Изменение первого элемента произошло до выделения нового массива и видно вызывающему.
Влияние append и изменения элементов на исходный слайс
Внутри mutate выводится [0 2 3 4 1], после возврата — [0 2 3 4]. Изменение первого элемента произошло до выделения нового массива и видно вызывающему.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Рассмотрим пример, показывающий, как изменение элементов слайса и применение функции append внутри передаваемой функции отражаются на самом слайсе. Определите, какой вывод будет получен на каждом этапе выполнения программы.
func main() {
mutate := func(a []int) {
a[0] = 0
a = append(a, 1) // ?
fmt.Println(a) // ?
}
a := []int{1, 2, 3, 4}
mutate(a)
fmt.Println(a) // ?
}
Ответ
Внутри mutate выводится [0 2 3 4 1], после возврата — [0 2 3 4]. Изменение первого элемента произошло до выделения нового массива и видно вызывающему.
У литерала len=cap=4. Запись a[0]=0 меняет общий массив. Затем append пятого элемента выделяет другой массив и копирует уже изменённые значения. Его новый заголовок остаётся внутри mutate, поэтому длина внешнего a не растёт. Чтобы сохранить добавление, верните результат и присвойте его в main.