go - 当另一个对象告诉结构更新时结构字段不更新

标签 go struct

我有以下 struct,它具有可以更新其字段的功能:

type Dog struct {
    name string
    age  int
}

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

以上内容单独运行良好。但是,当 struct 属于另一个对象并且该对象告诉 struct 更新其字段时,更改似乎发生但未应用:

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.
}

我假设我必须以某种方式使用指针,但不太清楚如何。

最佳答案

如果您希望该方法修改接收者的状态,则该方法的接收者类型应该是指针类型。

也就是说,与声明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()
}

关于go - 当另一个对象告诉结构更新时结构字段不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55236767/

相关文章:

c - 修改作为指针传递的结构 - C

c - 如何在 C 中为枚举赋值?

c - 可变长度结构C

go - 从 slice 中删除所有出现的相同元素

http - 通过代理连接到服务器

image - Golang如何将图像连接/附加到另一个

c++ - 如何使用混合类型的 c++ 结构并只将一些值传递给 OpenGL?

string - 删除字符串中定界符后的所有字符

multithreading - GO:在简单的 tcp 服务器上超过 10000 个线程?

python - 通过 UDP 发送 float 结构