Определение длины и ёмкости слайса до и после вызова функции

Снаружи numbers сохраняет len=1 и cap=1. Внутри add после append локальный слайс имеет len=2 и cap не меньше 2, но этот новый заголовок не возвращается вызывающему.

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

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

Снаружи numbers сохраняет len=1 и cap=1. Внутри add после append локальный слайс имеет len=2 и cap не меньше 2, но этот новый заголовок не возвращается вызывающему.

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

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

Условие

Необходимо выяснить, как изменятся параметры длины и ёмкости среза до и после выполнения функции add.

numbers := make([]int, 0, 1)
numbers = append(numbers, 1)
// len = 1, cap = 1

add(numbers, 2)
// len = 1, cap = 1

func add(slice []int, value int) {
    slice = append(slice, value)
}

Ответ

Снаружи numbers сохраняет len=1 и cap=1. Внутри add после append локальный слайс имеет len=2 и cap не меньше 2, но этот новый заголовок не возвращается вызывающему.

Поскольку свободной ёмкости нет, append выделяет новый backing array. Прежний numbers остаётся [1]. Чтобы сохранить добавленную двойку, объявите func add(s []int, v int) []int { return append(s, v) } и выполните numbers = add(numbers, 2). Точную capacity нового массива не следует считать частью контракта.

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

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

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

Подробнее