Исходник не компилируется: у слайса нет метода append. Если заменить a.append(a,7) на a=append(a,7), вывод будет [0 1 5 6], [5 1 5 6 7], затем [5 1 5 6].
Какой результат выведет программа №26
Исходник не компилируется: у слайса нет метода append. Если заменить a.append(a,7) на a=append(a,7), вывод будет [0 1 5 6], [5 1 5 6 7], затем [5 1 5 6].
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Определите, что будет напечатано в консоль после выполнения приведённого ниже Go‑кода.
func fn(a []int){
a[2] = 5
a = append(a, 6)
fmt.Println(a)
a.append(a, 7)
a[0] = 5
fmt.Println(a)
}
func main() {
a := make ([]int, 0, 5)
for i := 0; i < 4; i++ {
a = append(a, i)
}
fn(a[:3])
fmt.Println(a)
}
Ответ
Исходник не компилируется: у слайса нет метода append. Если заменить a.append(a,7) на a=append(a,7), вывод будет [0 1 5 6], [5 1 5 6 7], затем [5 1 5 6].
В main длина a равна 4, capacity — 5. Переданный a[:3] делит тот же массив и имеет capacity 5, поэтому оба append помещаются без новой аллокации. Запись a[2]=5, добавление 6 и запись a[0]=5 видны вызывающему. Последняя семёрка лежит за пределом его длины 4 и потому не печатается в main.