Почему метод Increment с получателем по значению не изменяет Count в Go?

Задача на методы Go: исправляем опечатку в объявлении переменной, объясняем копирование получателя и показываем отличие Count от *Count.

Короткий ответ

Что ответить на собеседовании

С опечаткой car count Count исходный фрагмент не компилируется. После замены car на var и добавления package main и импорта fmt программа печатает 0: метод получает копию Count. Чтобы изменить исходную переменную, нужен получатель *Count и операция (*c)++.

Подробный разбор

Ответ с пояснениями

Условие

Что выведет следующий фрагмент?

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; не переносите вывод механически на структуры со срезами или указателями: копия такого значения может сохранять доступ к общим данным.

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку