Вывод будет Bob, затем Alice. Присваивание *p1 заменяет содержимое объекта, на который указывает исходный p.
Анализ передачи указателя на структуру в функцию
Вывод будет Bob, затем Alice. Присваивание *p1 заменяет содержимое объекта, на который указывает исходный p.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В задаче требуется рассмотреть, как меняются данные структуры, когда её указатель передаётся в функцию, и какие значения будут напечатаны до и после изменения внутри функции.
package main
import "fmt"
type Person struct {
Name string
}
func changeName(p1 *Person) {
*p1 = Person{Name: "Alice"}
}
func main() {
p := &Person{Name: "Bob"}
fmt.Println(p.Name)
changeName(p)
fmt.Println(p.Name)
}
Ответ
Вывод будет Bob, затем Alice. Присваивание *p1 заменяет содержимое объекта, на который указывает исходный p.
Параметр p1 получает копию указателя, но она содержит тот же адрес. Выражение *p1 = Person{Name: "Alice"} записывает новую структуру по этому адресу, поэтому изменение видно в main.
Если бы функция делала p1 = &Person{Name: "Alice"}, изменился бы только локальный указатель и p.Name осталось бы Bob. При nil-аргументе текущая функция вызвала бы panic; в данном примере p создан корректно и не nil.