Анализ передачи указателя на структуру в функцию

Вывод будет 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.

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

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

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

Подробнее