Влияние функции append на слайс, переданный по значению

Программа выведет [Привет Привет]. В общий массив добавится Пока, но длина testSlice в main останется равной 2.

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

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

Программа выведет [Привет Привет]. В общий массив добавится Пока, но длина testSlice в main останется равной 2.

Подробный разбор

Ответ с пояснениями

Условие

Определите, какой вывод получит программа, когда срез передаётся в функцию, а внутри неё к нему применяется append. Учтите, что в Go срезы передаются как значение, поэтому изменения, внесённые в срез внутри функции, могут не отразиться на оригинальном срезе, объявленном вне функции.

func main() {
    testSlice := make([]string, 0, 3)
    testSlice = append(testSlice, "Привет")
    testSlice = append(testSlice, "Привет")
    test(testSlice)

    fmt.Println(testSlice)
}

func test(testSlice []string) {
    testSlice = append(testSlice, "Пока")
}

Ответ

Программа выведет [Привет Привет]. В общий массив добавится Пока, но длина testSlice в main останется равной 2.

Копия дескриптора, переданная в test, имеет вместимость 3, поэтому append использует существующий массив. Новая длина 3 сохраняется только внутри test.

В main запись можно увидеть через testSlice[:3], однако обычная печать учитывает прежнюю длину. Если функция должна расширять срез для вызывающей стороны, возвращайте результат append и присваивайте его: testSlice = test(testSlice). Передача среза по значению не означает копирование всех его элементов.

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

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

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

Подробнее