Sobes.tech
Back to questions
Intern
4

Почему при необходимости изменить поля структуры внутри функции аргумент обычно делают указателем на структуру, а не значением?

Companies where asked
AvitoAvito

Answer from AI

sobes.tech AI

В Go аргументы функций передаются по значению, то есть копируются. Если передать структуру значением, то внутри функции будет работать копия этой структуры, и изменения полей не повлияют на оригинал.

Чтобы изменить поля структуры внутри функции и сохранить эти изменения после выхода из функции, нужно передавать указатель на структуру. Тогда функция будет работать с оригинальными данными, а не с копией.

Пример:

type User struct {
    Name string
}

func changeNameByValue(u User) {
    u.Name = "Alice"
}

func changeNameByPointer(u *User) {
    u.Name = "Bob"
}

func main() {
    user := User{Name: "John"}
    changeNameByValue(user)
    fmt.Println(user.Name) // Выведет "John" — копия изменилась, оригинал нет

    changeNameByPointer(&user)
    fmt.Println(user.Name) // Выведет "Bob" — оригинал изменён
}

Таким образом, указатель нужен для изменения исходной структуры, а не её копии.