С опечаткой car count Count исходный фрагмент не компилируется. После замены car на var и добавления package main и импорта fmt программа печатает 0: метод получает копию Count. Чтобы изменить исходную переменную, нужен получатель *Count и операция (*c)++.
Почему метод Increment с получателем по значению не изменяет Count в Go?
Задача на методы Go: исправляем опечатку в объявлении переменной, объясняем копирование получателя и показываем отличие Count от *Count.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Что выведет следующий фрагмент?
type Count int
func (c Count) Increment() {
c++
}
func main() {
car count Count
count.Increment()
fmt.Print(count)
}
Ошибки исходного фрагмента
car count Count — некорректное объявление. Для переменной здесь нужно var count Count. Если это отдельный файл программы, также необходимы package main и import "fmt". Исходный текст в приведённом виде не компилируется.
Рабочий вариант для разбора
package main
import "fmt"
type Count int
func (c Count) Increment() {
c++
}
func main() {
var count Count
count.Increment()
fmt.Print(count)
}
Программа печатает 0. У переменной count начальное значение — ноль. Получатель c Count передаётся по значению: внутри метода увеличивается копия, а исходная переменная остаётся неизменной.
Как изменить исходное значение
Замените метод на вариант с указателем:
func (c *Count) Increment() {
(*c)++
}
Теперь тот же вызов count.Increment() увеличит count, и программа напечатает 1. Переменная адресуемая, поэтому Go разрешает такой вызов вместо явного (&count).Increment().
Различие получателей по значению и по указателю разобрано в Effective Go. В этой задаче Count основан на int; не переносите вывод механически на структуры со срезами или указателями: копия такого значения может сохранять доступ к общим данным.