2 回答
TA贡献1810条经验 获得超5个赞
把 Go 中的函数想象成它们都属于一个命名空间。Go 确实没有类、方法或继承,因此您尝试的操作永远不会按您的预期工作。
换句话说,当您定义这样的函数时:
func (f *Foo) DoStuff()
你可以想象它真的被定义为:
func DoStuff(f *Foo)
所以你可能会注意到为什么 Go 选择name在你的Super结构上调用函数——它是唯一匹配的函数签名。(请注意,在您的WhoAmI函数super中定义为super *Superso Go 将其与相同类型的相应函数匹配。)
至于如何以 Go 方式执行此操作,请尝试使用接口:
http://play.golang.org/p/8ELw-9e7Re
package main
import "fmt"
type Indentifier interface {
WhoAmI() string
}
type A struct{}
func (a *A) WhoAmI() string {
return "A"
}
type B struct{}
func (b *B) WhoAmI() string {
return "B"
}
func doSomething(x Indentifier) {
fmt.Println("x is a", x.WhoAmI())
}
func main() {
doSomething(&A{})
doSomething(&B{})
}
TA贡献1869条经验 获得超4个赞
嵌入不是子类化。Go 中没有超类或子类。Sub这里不是 的“孩子” Super。它包含一个Super. 你不能做你想做的事。您需要以不同的方式组织您的代码,以便不需要它。
例如,这里 ( playground ) 是在 Go 中执行此操作的更自然的方法:
package main
import "fmt"
type Namer interface {
Name() string
}
type Super struct{}
func (sub *Super) Name() string {
return "Super"
}
type Sub struct{}
func (sub *Sub) Name() string {
return "Sub"
}
func WhoAmI(namer Namer) {
fmt.Printf("I'm %s.\n", namer.Name())
}
func main() {
sub := &Sub{}
WhoAmI(sub)
}
与其关注类(Go 没有),不如关注接口。这不是事物是什么的问题,而是它们能做什么的问题。这是一种非常强大的编程方法,在实践中通常比继承抽象更灵活且不易出错。
- 2 回答
- 0 关注
- 113 浏览
添加回答
举报