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

Что выведет Go: ресиверы по значению и указателю

Вопрос

Что выведет программа? Go 1.23, в go.mod указано go 1.23.

package main

import "fmt"

type Box struct{ n int }

func (b Box) IncVal()  { b.n++ }
func (b *Box) IncPtr() { b.n++ }

func main() {
    b := Box{}
    b.IncVal()
    b.IncPtr()
    b.IncPtr()
    p := &b
    p.IncVal()
    fmt.Println(b.n)
}

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

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

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

Коротко

Код выведет: 2. IncVal работает с копией и ничего не меняет, даже если вызван через указатель p (Go разыменует его и скопирует значение).

Что выведет

2

Разбор

IncVal работает с копией и ничего не меняет, даже если вызван через указатель p (Go разыменует его и скопирует значение). Два вызова IncPtr для адресуемой переменной b автоматически берут &b и увеличивают счётчик до 2.

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

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