是否可以将先前声明的函数绑定到结构?

时间:2014-12-20 05:12:47

标签: struct go

是否可以将先前声明的函数绑定到多个结构?例如:

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使用什么术语,但似乎接口不适用于这种情况,因为它需要为每个结构重新实现方法。

1 个答案:

答案 0 :(得分:3)

执行此操作的一种方法是将方法声明为第三个结构的一部分:

type Foo struct {}

func (f Foo) SayHi() {
    fmt.Prinln("hi!")
}

然后可以通过嵌入此方法将此方法添加到A

type A struct {
    Foo
}

A将公开Foo的所有方法,并且由于Foo是一个空结构,因此它不会影响其内存中布局。请注意,调用SayHi方法时,它不知道是在A还是Foo变量上调用它,因此这仅适用于自包含方法

如果方法体确实需要知道接收器的类型,则需要在A上显式声明该方法。您可以将正文分解为辅助函数,以与其他类型共享实现。