go - 在继承的结构上使用链方法

标签 go

我是 Go 的新手。我正在解决一个与此相似的问题,我有一个从 Animal 结构继承的结构 Dog。我想链接方法,这样我就可以得到像“我是动物。汪!”这样的结果。但是当我运行这个程序时,它产生了一个错误

dog.Animal.Hello().Bark undefined (type *Animal has no field or method Bark)

type Animal struct {
    name string
    age int
}

func (animal *Animal) Hello() *Animal {
    fmt.Println("I am an animal")
    return animal
}

type Dog struct {
    *Animal
}

func (dog *Dog) Bark() *Dog {
    fmt.Println("woof!")
    return dog
}

func main() {
    dog := &Dog{&Animal{name: "Peter", age: 25}}
    dog.Hello().Bark()
}

我怎样才能克服这个问题。感谢您的任何建议

最佳答案

dog.Hello() 返回一个 *Animal,而不是一个 *Dog,所以你不能只调用 。 Bark() 返回值。

请注意,调用 dog.Hello() 并不真的调用 Dog 上的 Hello() > 结构,而是包含在 *Animal 中。它只是语法糖,相当于 dog.animal.Hello()(如果 *Animal 字段被命名,而不是匿名)。这不是继承!

但是,您已经有了一个*Dog,所以您可以直接调用.Bark():

dog.Hello()
dog.Bark()

关于接口(interface)的评论中的建议也可能适用,但对于这个玩具示例,很难说出您首先要实现的目标。

关于go - 在继承的结构上使用链方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53175308/

相关文章:

go - 查询具有一种关系的正确方法

go - 将 YAML 解析为具有子结构数组的结构映射

go - 如何从 Go WebAssembly 访问 DOM 元素属性?

go - 为 vscode 项目/终端设置 $GOPATH

go - 如何删除 GORM 中有关系的表?

go - 将 Go []byte 转换为 C *char

go - 使用 chrome headless 和 GO 转储 DOM

go - 在 Go 中清除缓冲区

go - 从 Redis 获取结构数组时解码错误

pdf - 如何通过gopdf将文本数据打印成pdf?