首先,我是 Go 的新手,所以请原谅术语中的任何失误或错误。我怀疑我对术语的缺乏掌握也部分归咎于在查找了许多小时后没有找到以下问题的答案。
简而言之,我希望以下代码的输出是
I am the Adult
I am the Child
输出在哪里
I am the Adult
I am the Adult
代码:
package main
import "fmt"
type Human struct {
age uint
name string
}
func (h Human) sayName() error {
fmt.Println("I am the Adult")
return nil
}
func (h Human) Introduce() error {
h.sayName()
return nil
}
type Child struct {
Human
}
func (c Child) sayName() error {
fmt.Println("I am the Child")
return nil
}
func main() {
h := Human{}
h.Introduce()
c := Child{Human{}}
c.Introduce()
}
所以本质上,虽然 Introduce() 只在嵌入类型 Human 中实现,但它调用了 sayName(),它在嵌入类型和嵌入类型中都实现了。
我知道当前的输出是这样的,因为嵌入的 Human 结构不“知道”它是嵌入的,因此永远不会调用 Child.sayName 并且只会调用它自己的 sayName() 函数。
有没有一种方法可以实例化一个 Human 结构(或一个结构嵌入结构),您可以在其中用另一个 sayName() 函数“替换”Human.sayName()?
最佳答案
获得这种后期绑定(bind)行为的方法是使用接口(interface)。如果 Introduce
是接口(interface)上的一个方法,需要一个 sayName
方法,那么 Human
和 Child
都会满足接口(interface),并且可以 Introduce
自己,并且在任何一种情况下都会调用正确的 sayName
方法,因为它将通过接口(interface)类型而不是通过 Human
。
关于go - 访问嵌入式函数中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37059377/