猿问

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

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


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


冉冉说
浏览 160回答 1
1回答

猛跑小猪

一种方法是将该方法声明为第三个结构的一部分:type Foo struct {}func (f Foo) SayHi() {    fmt.Prinln("hi!")}然后可以A通过嵌入来添加此方法:type A struct {    Foo}A将公开 的所有方法Foo,并且由于Foo是一个空结构,因此不会影响其内存布局。请注意,当该SayHi方法被调用时,它不会知道它是在 anA还是Foo变量上调用的,因此这仅适用于自包含方法。如果方法主体确实需要知道接收者的类型,则需要在 上显式声明该方法A。您可以将主体分解为辅助函数,以便与其他类型共享实现。
随时随地看视频慕课网APP

相关分类

Go
我要回答