登录
首页 >  Golang >  Go问答

当结构字段未被更新,即使另一对象已通知结构更新

来源:stackoverflow

时间:2024-02-22 21:39:24 361浏览 收藏

小伙伴们有没有觉得学习Golang很有意思?有意思就对了!今天就给大家带来《当结构字段未被更新,即使另一对象已通知结构更新》,以下内容将会涉及到,若是在学习中对其中部分知识点有疑问,或许看了本文就能帮到你!

问题内容

我有以下 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.
}

我认为我必须以某种方式使用 pointers 但不太清楚如何使用。


解决方案


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

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

将 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

好了,本文到此结束,带大家了解了《当结构字段未被更新,即使另一对象已通知结构更新》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>