Что выведет код 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 ошибок.