当另一个对象告诉结构体更新时,结构体字段不会更新

3
我可以帮您进行中文翻译。以下是翻译结果:

我有一个包含可以更新其字段的函数的struct

Original Answer翻译成"最初的回答"
type Dog struct {
    name string
    age  int
}

func (dog *Dog) growOld() {    
    dog.name = "old dog"
    dog.age++
}

这个代码片段本身是没有问题的。但是,当这个struct属于另一个对象,并且该对象告诉struct更新其字段时,更改似乎发生了,但没有被应用:

原始答案:Original Answer

package main

import (
    "fmt"
)

type Owner struct {
    dog Dog
}

func newOwner(dog Dog) Owner {
    var owner Owner
    owner.dog = dog

    return owner
}

func (owner Owner) tellDogToGrowOld() {
    owner.dog.growOld()
}

func main() {
    var dog Dog
    dog.name = "dog"

    owner := newOwner(dog)
    owner.tellDogToGrowOld()       

    fmt.Println(dog) // dog's name is still `dog` and age is 0.
}

我猜我必须以某种方式使用指针,但无法完全弄清楚如何使用。最初的回答

3
tellDogToGrowOld需要像你对growOld所做的那样,在指针上进行定义。或者,Ownerdog字段需要是指向Dog的指针。 - undefined
@mkopriva 嘿,它成功了!请将此作为答案添加,以便我可以接受。谢谢! - undefined
@mkopriva 我选择了Ownerdog字段应该是指向Dog的指针的方法,因为这是最接近其他语言中的“按引用传递”的方式。 - undefined
2个回答

9

如果您想让方法修改接收器的状态,则方法的接收器类型应该是指针类型。

也就是说,与您声明 growOld 方法的方式相同, tellDogToGrowOld 方法也应该有一个指针接收器:

func (owner *Owner) tellDogToGrowOld() {
    owner.dog.growOld()
}

或者,您可以将要修改的字段设置为指针,例如:

type Owner struct {
    dog *Dog
}

func newOwner(dog *Dog) Owner {
    var owner Owner
    owner.dog = dog

    return owner
}

func (owner Owner) tellDogToGrowOld() {
    owner.dog.growOld()
}

3

将Owner字段设置为*Dog而不是Dog

type Owner struct {
    dog *Dog
}

func newOwner(dog *Dog) Owner {
    var owner Owner
    owner.dog = dog

    return owner
}

在主程序中调用时,请使用&dog。

var dog Dog
    dog.name = "dog"

    owner := newOwner(&dog)

https://play.golang.org/p/LpFqW09dOs4


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接