Если фрагмент находится внутри функции, при выходе из неё будет напечатано 123. Получатель метода S передаётся по значению и сохраняется при регистрации defer.
Какой вывод получит программа №72
Если фрагмент находится внутри функции, при выходе из неё будет напечатано 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.