这是因为接收器被定义为一个值(而不是指针(。如果将
我是围棋的超级初学者,并试图通过围棋自学,所以如果我没有非常连贯,我很抱歉。我正试着使用两个文件。在文件1中,我想创建一个Person(30岁,名叫Peter(的实例。在这个文件中,我希望能够调用Change,并将他的名字改为Alex。
如果我只是打电话给用户,这就行了。名称更改-但不更改(用户(。我该如何让它按预期工作?
非常感谢。
文件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"
}
Change
更改为
func Change(user *person.User) {
user.NameChange()
}
并使用进行调用
Change(&user)
那么你应该表现得很好。
函数参数是按值传递的,因此,当您输入Change函数时,您会在用户变量中获得User结构的副本。你在副本上调用NameChange,而不是在原件上。要更改原始结构,必须将该结构作为指针传递。
文件1:
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"
}
点击此处了解更多信息。此处对指针进行了描述。