gpt4 book ai didi

go - 为什么 SetAge() 方法不能正确设置年龄?

转载 作者:IT王子 更新时间:2023-10-29 01:35:46 26 4
gpt4 key购买 nike

我正在试验 GoLang 和接口(interface)以及结构继承。

我创建了一组结构,其想法是我可以将通用方法和值保留在核心结构中,然后只需继承它并根据需要添加额外的值:

type NamedThing interface {
GetName() string
GetAge() int
SetAge(age int)
}

type BaseThing struct {
name string
age int
}

func (t BaseThing) GetName() string {
return t.name
}

func (t BaseThing) GetAge() int {
return t.age
}

func (t BaseThing) SetAge(age int) {
t.age = age
}

type Person struct {
BaseThing
}

func main() {
p := Person{}
p.BaseThing.name = "fred"
p.BaseThing.age = 21
fmt.Println(p)
p.SetAge(35)
fmt.Println(p)
}

你也可以在 go playground 中找到:

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

但是,当我运行 main 方法时,年龄仍然是“21”,并且不会被 SetAge() 方法更新。

我试图理解为什么会这样,以及我需要做什么才能让 SetAge 正常工作。

最佳答案

您的函数接收者是值类型,因此它们被复制到您的函数作用域中。要在函数的生命周期之后影响您接收到的类型,您的接收器应该是指向您的类型的指针。见下文。

type NamedThing interface {
GetName() string
GetAge() int
SetAge(age int)
}

type BaseThing struct {
name string
age int
}

func (t *BaseThing) GetName() string {
return t.name
}

func (t *BaseThing) GetAge() int {
return t.age
}

func (t *BaseThing) SetAge(age int) {
t.age = age
}

type Person struct {
BaseThing
}

func main() {
p := Person{}
p.BaseThing.name = "fred"
p.BaseThing.age = 21
fmt.Println(p)
p.SetAge(35)
fmt.Println(p)
}

关于go - 为什么 SetAge() 方法不能正确设置年龄?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40953040/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com