Программа напечатает [1 2]. В add передаётся копия заголовка слайса, поэтому изменения её длины не отражаются на s в main.
Какой результат выведет программа №12
Программа напечатает [1 2]. В add передаётся копия заголовка слайса, поэтому изменения её длины не отражаются на s в main.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Каким будет вывод программы после её выполнения?
func main() {
s := make([]int, 0, 3)
s = append(s, 1)
s = append(s, 2)
add(s)
fmt.Printf("%v", s)
}
func add(s []int) {
s = append(s, 3)
s = append(s, 4)
}
Ответ
Программа напечатает [1 2]. В add передаётся копия заголовка слайса, поэтому изменения её длины не отражаются на s в main.
Первый append записывает 3 в общий массив на позицию 2: исходная capacity равна 3. Второй append уже требует нового массива и записывает туда 4. Длина исходного s остаётся равной 2, поэтому скрытая тройка не попадает в fmt.Printf. Чтобы сохранить расширение, add должна вернуть слайс, а вызывающий — присвоить результат.