Код выведет:
Что выведет код при выполнении?
Код выведет:
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Что выведет код при выполнении?
package main
import "fmt"
type Counter struct { val int }
func (c Counter) IncVal() { c.val++ }
func (c *Counter) IncPtr() { c.val++ }
func main() { c := Counter{val: 1} c.IncVal() fmt.Print(c.val, " ") c.IncPtr() fmt.Print(c.val) }
Ответ
Код выведет:
1 2
Объяснение:
- Метод
IncVal()имеет получателя по значению (c Counter), поэтому внутри метода создаётся копия структурыCounter. Увеличениеc.val++изменяет копию, а не оригинал, поэтому значениеvalвmainостаётся 1. - Метод
IncPtr()имеет получателя по указателю (c *Counter), поэтому изменения внутри метода влияют на оригинальный объект. После вызоваc.IncPtr()значениеvalувеличивается на 1 и становится 2.
Таким образом, сначала выводится 1, затем после вызова метода с указателем — 2.