После исправления list.[1] на list[1] вывод будет 26, затем 27. После append указатель alex остаётся на элементе старого массива.
Какой вывод появится в консоли (пример 30)
После исправления list.[1] на list[1] вывод будет 26, затем 27. После append указатель alex остаётся на элементе старого массива.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Какой результат будет выведен при выполнении следующей программы?
import (
"fmt"
)
type person struct {
age int
}
func main() {
list := [] person{
{age: 18},
{age: 25},
}
alex := &list[1]
alex.age++
list = append (list, person{age:30})
alex.age++
fmt.Println(list.[1].age)
fmt.Println(alex.age)
}
Ответ
После исправления list.[1] на list[1] вывод будет 26, затем 27. После append указатель alex остаётся на элементе старого массива.
Первое увеличение меняет возраст в list с 25 на 26. Исходный литерал имеет длину и вместимость 2, поэтому добавление третьего person выделяет новый массив и копирует туда уже изменённые значения.
alex продолжает ссылаться на старое хранилище: второе увеличение делает там 27, но новый list сохраняет 26. Указатель не становится висячим — сборщик мусора учитывает его и сохраняет объект живым. Программа в исходном виде с лишней точкой не запускается.