Внутри функции длина после append равна 1, а снаружи остаётся 0. При входе передаётся копия заголовка среза с длиной 0 и ёмкостью 5.
Какова длина среза при передаче в функцию
Внутри функции длина после append равна 1, а снаружи остаётся 0. При входе передаётся копия заголовка среза с длиной 0 и ёмкостью 5.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Дано s := make([]int, 0, 5). Функция func addNum(s []int) { s = append(s, 1); fmt.Println(len(s)) } вызывается как addNum(s), затем снаружи печатается len(s). Что выведется?
Ответ
Внутри функции длина после append равна 1, а снаружи остаётся 0. При входе передаётся копия заголовка среза с длиной 0 и ёмкостью 5.
Append может использовать тот же backing array, но изменённая длина локального заголовка не записывается обратно вызывающему коду. Возвращайте новый срез: func addNum(s []int) []int { return append(s, 1) }, затем s = addNum(s). Совместное хранение элементов и передача длины — разные аспекты среза.
Источник: go.dev.