Как изменить значение без pointer receiver в Go

Верните новое значение и присвойте его вызывающей переменной. Value receiver получает копию, поэтому изменение его самого не меняет исходный Number.

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

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

Верните новое значение и присвойте его вызывающей переменной. Value receiver получает копию, поэтому изменение его самого не меняет исходный Number.

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

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

Условие

Есть type Number int и func (n Number) Set(v Number) { n = v }. После n := Number(123); n.Set(456) значение не меняется. Как получить 456 без pointer receiver?

Ответ

Верните новое значение и присвойте его вызывающей переменной. Value receiver получает копию, поэтому изменение его самого не меняет исходный Number.

Например:

func (n Number) WithValue(v Number) Number { return v }
// Использование:
n := Number(123)
n = n.WithValue(456)
fmt.Println(n)

Такой контракт явно выражает создание нового значения. Для структур с map или slice внутри value receiver копирует заголовок, а не всё вложенное хранилище; это отдельный случай.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее