Как ещё можно решить проблему с изменением указателя в функции, если не менять поле напрямую?

Чтобы изменить указатель у вызывающей стороны, верните новый указатель и присвойте результат либо передайте указатель на указатель. Простое присваивание локальному параметру не помогает.

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

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

Чтобы изменить указатель у вызывающей стороны, верните новый указатель и присвойте результат либо передайте указатель на указатель. Простое присваивание локальному параметру не помогает.

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

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

Чтобы изменить указатель у вызывающей стороны, верните новый указатель и присвойте результат либо передайте указатель на указатель. Простое присваивание локальному параметру не помогает.

Два независимых варианта:

func replace() *User { return &User{} }
// caller: user = replace()

func replaceInPlace(dst **User) {
    *dst = &User{}
}
// caller: replaceInPlace(&user)

Второй вариант предполагает ненулевой dst. Обычный параметр *User является копией указателя: через него можно изменить объект, но присваивание самому параметру не меняет переменную вызывающего кода. Если прямое изменение поля не требуется, возврат значения обычно делает контракт понятнее.

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

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

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

Подробнее