Какой вывод появится в консоли (пример 30)

После исправления list.[1] на list[1] вывод будет 26, затем 27. После append указатель alex остаётся на элементе старого массива.

Короткий ответ

Что ответить на собеседовании

После исправления 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. Указатель не становится висячим — сборщик мусора учитывает его и сохраняет объект живым. Программа в исходном виде с лишней точкой не запускается.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее