Исходник синтаксически неверен. Если оформить func main и создать x := X{123}, отложенный x.S() напечатает 456.
Какой вывод получит программа №73
Исходник синтаксически неверен. Если оформить func main и создать x := X{123}, отложенный x.S() напечатает 456.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Определите, какой текст будет напечатан в консоль при запуске следующего кода на Go:
type X struct {
V int
}
func (x * X) S(){
fmt.Println(x.V)
}
main()
x := x{123}
defer x.S()
x.V = 456
Ответ
Исходник синтаксически неверен. Если оформить func main и создать x := X{123}, отложенный x.S() напечатает 456.
Метод S имеет получатель *X. При регистрации defer сохраняется указатель на тот же объект, а не копия значения V. До выполнения defer поле этого объекта меняется на 456.
Исправленная последовательность внутри main: x := X{123}; defer x.S(); x.V = 456. Необходимо также подключить fmt. При получателе-значении func (x X) S() defer сохранил бы копию структуры, и результат был бы 123 — это другой контракт метода.