// Что выведет следующий код и почему?

Код выведет:

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

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

Код выведет:

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

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

Условие

// Что выведет следующий код и почему?

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

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

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

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

Подробнее