Влияние append и изменения элементов на исходный слайс

Внутри mutate выводится [0 2 3 4 1], после возврата — [0 2 3 4]. Изменение первого элемента произошло до выделения нового массива и видно вызывающему.

Короткий ответ

Что ответить на собеседовании

Внутри 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.

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

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

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

Подробнее