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