Что выведет код Senior Структуры, методы и интерфейсы обновлено

Что выведет Go: method value и defer копируют ресивер

Вопрос

Что выведет программа? Go 1.23, в go.mod указано go 1.23. Каждую строку вывода пишите с новой строки.

package main

import "fmt"

type T struct{ n int }

func (t T) Show() { fmt.Println(t.n) }

func main() {
    t := T{1}
    f := t.Show
    defer t.Show()
    t.n = 2
    f()
    g := (&t).Show
    t.n = 3
    g()
}

Попробуйте сами

Напишите, что выведет код: каждый вывод с новой строки.

Показать ответ и разбор

Коротко

Код выведет: 1, 2, 1. Method value t.Show с ресивером по значению копирует ресивер в момент вычисления, поэтому f() печатает 1. defer t.Show() тоже вычисляет ресивер сразу, при t.n = 1, и выполнится последним.

Что выведет

1
2
1

Разбор

Method value t.Show с ресивером по значению копирует ресивер в момент вычисления, поэтому f() печатает 1. defer t.Show() тоже вычисляет ресивер сразу, при t.n = 1, и выполнится последним. (&t).Show разыменует указатель и скопирует значение при t.n = 2, последующее t.n = 3 на g не влияет.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.