Программа выведет [Привет Привет]. В общий массив добавится Пока, но длина testSlice в main останется равной 2.
Влияние функции append на слайс, переданный по значению
Программа выведет [Привет Привет]. В общий массив добавится Пока, но длина 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). Передача среза по значению не означает копирование всех его элементов.