Что выведет код Senior Структуры, методы и интерфейсы обновлено
Что выведет Go: интерфейс хранит копию значения
Вопрос
Что выведет программа? Go 1.23, в go.mod указано go 1.23.
package main
import "fmt"
type Counter struct{ n int }
func (c Counter) Value() int { return c.n }
type Valuer interface{ Value() int }
func main() {
c := Counter{n: 1}
var v Valuer = c
var vp Valuer = &c
c.n = 10
fmt.Println(v.Value(), vp.Value())
}
Попробуйте сами
Напишите, что выведет код: каждый вывод с новой строки.
Показать ответ и разбор
Коротко
Код выведет: 1 10. Присваивание значения в интерфейс копирует его, поэтому v хранит Counter{1} и не видит изменений. vp хранит указатель на c, а метод с ресивером по значению разыменует указатель в момент вызова и увидит 10.
Что выведет
1 10
Разбор
Присваивание значения в интерфейс копирует его, поэтому v хранит Counter{1} и не видит изменений. vp хранит указатель на c, а метод с ресивером по значению разыменует указатель в момент вызова и увидит 10.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Что выведет Go: встраивание и вызов метода
Следующий вопрос
Что выведет Go: method value и defer копируют ресивер
Ещё по теме «Структуры, методы и интерфейсы»
- LRU-кеш на Go: map и двусвязный список
- Очередь с приоритетом через container/heap на Go
- Площади фигур через интерфейс Shape на Go
- Сортировка структур по нескольким ключам на Go
- Что выведет Go: nil-указатель в интерфейсе error
- Что выведет Go: ресиверы по значению и указателю
- Что выведет Go: сравнение структур и указателей
- Что выведет Go: type switch