Изменить структуру с функцией в другом файле - PullRequest
0 голосов
/ 16 декабря 2018

Я супер новичок в Go и пытаюсь научить себя играть, поэтому извиняюсь, если я не фантастически последовательный.Я пытаюсь использовать два файла.В файле 1 я хочу создать экземпляр Person (30 лет, по имени Peter).В этом файле я хочу иметь возможность вызвать Change, и его имя изменилось на Alex.

Это работает, если я просто вызываю user.NameChange - но не change (user).Как мне заставить это работать как задумано?

С благодарностью.

ФАЙЛ 1:

package main

import (
    "fmt"
    "greetings/person"
)

func Change(user person.User) {
    user.NameChange()
}

func main() {
    user := person.User{"Peter", 30}
    fmt.Println(user) // returns "Peter"
    Change(user)
    fmt.Println(user) // returns "Peter" - Expected "Alex"
}

ФАЙЛ 2:

package person

type User struct {
    Name string
    Age  int
}

func (u *User) NameChange() {
    u.Name = "Alex"
}

Ответы [ 2 ]

0 голосов
/ 16 декабря 2018

Параметры функции передаются по значению, поэтому, когда вы входите в функцию Change, вы получаете копию структуры User в вашей пользовательской переменной.И вы называете NameChange для копии, а не для оригинала.Чтобы изменить исходную структуру, вы должны передать структуру в качестве указателя.

File1:

package main

import (
    "fmt"
    "greetings/person"
)

// pass User as a pointer instead of value
func Change(user *person.User) {
    user.NameChange()
}

func main() {
    user := person.User{"Peter", 30}
    fmt.Println(user) // returns "Peter"
    Change(&user)
    fmt.Println(user) // returns "Peter" - Expected "Alex"
}

Подробнее об этом здесь .Указатели описаны здесь .

0 голосов
/ 16 декабря 2018

Это происходит потому, что получатель определяется как значение (в отличие от указателя).Если вы измените Change на

func Change(user *person.User) {
    user.NameChange()
}

и назовете его с помощью

Change(&user)

, тогда все будет хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...