Снаружи 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 нового массива не следует считать частью контракта.