Какой вывод получит программа №72

Если фрагмент находится внутри функции, при выходе из неё будет напечатано 123. Получатель метода S передаётся по значению и сохраняется при регистрации defer.

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

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

Если фрагмент находится внутри функции, при выходе из неё будет напечатано 123. Получатель метода S передаётся по значению и сохраняется при регистрации defer.

Подробный разбор

Ответ с пояснениями

Условие

Что будет напечатано при выполнении следующего кода на Go:

type X struct {
    V int
}

func (y X) S() {
    fmt.Println(y.V)
}

a := X{123}
defer a.S()
a.V = 456

Ответ

Если фрагмент находится внутри функции, при выходе из неё будет напечатано 123. Получатель метода S передаётся по значению и сохраняется при регистрации defer.

Отложенный вызов получает копию структуры a, содержащую V = 123. Последующее a.V = 456 меняет исходную переменную, но не сохранённый аргумент вызова.

При получателе *X результат был бы другим: сохранённый указатель позволил бы увидеть новое значение 456. Как самостоятельная программа приведённый фрагмент неполон: короткое объявление a и defer должны находиться в функции, также необходимы package и импорт fmt.

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

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

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

Подробнее