Какова длина среза при передаче в функцию

Внутри функции длина после 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.

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

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

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

Подробнее