Будет напечатано append [1 5], затем after [1 5 3 4]. У list[:1] длина 1, но capacity 4, поэтому append изменяет общий массив.
Какой вывод получит программа (пример 29)
Будет напечатано `append [1 5]`, затем `after [1 5 3 4]`. У list[:1] длина 1, но capacity 4, поэтому append изменяет общий массив.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Определите, какой текст появится в консоли после запуска следующей Go‑программы:
import (
"fmt"
)
func main() {
list := [] int{1, 2, 3, 4}
handle(list[:1])
fmt.Println("after", list)
}
func handle(list [] int) {
list = append(list, 5)
fmt.Println("append", list)
}
Ответ
Будет напечатано append [1 5], затем after [1 5 3 4]. У list[:1] длина 1, но capacity 4, поэтому append изменяет общий массив.
Функция handle получает копию заголовка слайса и увеличивает только её длину. Запись пятёрки попадает во второй элемент исходного массива, что видно после возврата. Если дописывание не должно влиять на исходник, передайте list[:1:1] или отдельную копию. Полное ограничение capacity защищает именно от совместного append, а не от прямой записи первого элемента.