Чтобы изменить указатель у вызывающей стороны, верните новый указатель и присвойте результат либо передайте указатель на указатель. Простое присваивание локальному параметру не помогает.
Как ещё можно решить проблему с изменением указателя в функции, если не менять поле напрямую?
Чтобы изменить указатель у вызывающей стороны, верните новый указатель и присвойте результат либо передайте указатель на указатель. Простое присваивание локальному параметру не помогает.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Чтобы изменить указатель у вызывающей стороны, верните новый указатель и присвойте результат либо передайте указатель на указатель. Простое присваивание локальному параметру не помогает.
Два независимых варианта:
func replace() *User { return &User{} }
// caller: user = replace()
func replaceInPlace(dst **User) {
*dst = &User{}
}
// caller: replaceInPlace(&user)
Второй вариант предполагает ненулевой dst. Обычный параметр *User является копией указателя: через него можно изменить объект, но присваивание самому параметру не меняет переменную вызывающего кода. Если прямое изменение поля не требуется, возврат значения обычно делает контракт понятнее.