Что выведет код 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 ошибок.
Предыдущий вопрос
Что выведет Go: интерфейс хранит копию значения
Следующий вопрос
Что выведет Go: nil-указатель в интерфейсе error
Ещё по теме «Структуры, методы и интерфейсы»
- LRU-кеш на Go: map и двусвязный список
- Очередь с приоритетом через container/heap на Go
- Площади фигур через интерфейс Shape на Go
- Сортировка структур по нескольким ключам на Go
- Что выведет Go: встраивание и вызов метода
- Что выведет Go: ресиверы по значению и указателю
- Что выведет Go: сравнение структур и указателей
- Что выведет Go: type switch