Код выведет:
// Что выведет следующий код и почему?
Код выведет:
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
// Что выведет следующий код и почему?
package main
import "fmt"
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 параметр person — это локальная копия указателя на структуру Person. Когда внутри функции person переназначается на новый адрес &Person{Name: "Alice"}, это изменение касается только локальной копии указателя, а не оригинального указателя, переданного в main.
Таким образом, в main переменная person продолжает указывать на исходный объект с именем "Bob".
Чтобы изменить имя оригинального объекта, нужно изменить поле через указатель, например:
func changeName(person *Person) {
person.Name = "Alice"
}
Тогда вывод будет:
Bob
Alice