Как изменяется значение указателя при его переназначении внутри функции

Будет напечатано Bob и Bob. changeName переназначает локальную копию указателя, но не меняет объект, на который указывает переменная в main.

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

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

Будет напечатано Bob и Bob. changeName переназначает локальную копию указателя, но не меняет объект, на который указывает переменная в main.

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

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

Условие

Каким будет вывод программы?

type Person struct {
  Name string
}

func changeName(person *Person) {
  person = &Person{
    Name: "Alice",
  }
}

func main() {
  person := &Person{
    Name: "Bob",
  }
  fmt.Println(person.Name)
  changeName(person)
  fmt.Println(person.Name)
}

Ответ

Будет напечатано Bob и Bob. changeName переназначает локальную копию указателя, но не меняет объект, на который указывает переменная в main.

Для изменения исходного объекта достаточно person.Name = "Alice". Если нужно заменить именно адрес, верните *Person и присвойте результат снаружи либо используйте **Person. Передача указателя по значению позволяет менять объект через него, но не сам указатель вызывающей функции.

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

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

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

Подробнее