是否可以将先前声明的函数绑定到多个结构?例如:
package main
import "fmt"
// very useful function both A and B should have
func SayHi() {
fmt.Println("hi!")
}
type A struct {} // A needs SayHi :(
type B struct {} // B needs SayHi :(
func main() {
a := A{}
a.SayHi()
b := B{}
b.SayHi()
}
主要原因是我不想为每种需要它的类型重复SayHi
实现,所以这不能作为答案:
type A struct {}
func A SayHi() {
fmt.Println("hi!")
}
type B struct {}
func B SayHi() {
fmt.Println("hi!")
}
换句话说,如何借用|继承|共享结构之间的方法?
PS:不确定Go使用什么术语,但似乎接口不适用于这种情况,因为它需要为每个结构重新实现方法。
答案 0 :(得分:3)
执行此操作的一种方法是将方法声明为第三个结构的一部分:
type Foo struct {}
func (f Foo) SayHi() {
fmt.Prinln("hi!")
}
然后可以通过嵌入此方法将此方法添加到A
:
type A struct {
Foo
}
A
将公开Foo
的所有方法,并且由于Foo
是一个空结构,因此它不会影响其内存中布局。请注意,调用SayHi
方法时,它不知道是在A
还是Foo
变量上调用它,因此这仅适用于自包含方法
如果方法体确实需要知道接收器的类型,则需要在A
上显式声明该方法。您可以将正文分解为辅助函数,以与其他类型共享实现。