登录
首页 >  Golang >  Go问答

实现具有相同逻辑的函数接口的方法

来源:stackoverflow

时间:2024-03-26 12:18:29 101浏览 收藏

本文探讨了在 Go 中为具有相同逻辑的函数接口提供多种实现的方法。作者提出了一种常见模式,即使用嵌入式类型和构造函数来实现后期绑定。此方法允许在实现内部调用共享函数,同时保持不同实现中这些函数的独特逻辑。文章还提供了替代方案,包括使用函数指针、传递函数作为参数或使用接口。

问题内容

我想为以下接口提供多种实现:

type api interface {
    a()
    b()
    c()
}

根据我的用例,所有实现都应共享函数 ab 完全相同的逻辑,而函数 c 将具有不同的逻辑对于不同的实现。

因此,我创建了以下要嵌入的通用实现:

type common struct {}

func (c *common) a() {}
func (c *common) b() {}

要为上面的接口创建两个实现,我可以执行以下操作:

type FirstImpl struct { Common }

func (i *FirstImpl) C() {}

type SecondImpl struct { Common }

func (i *SecondImpl) C() {}

一切都工作得很好,直到我发现函数c需要在函数b内部调用。请注意,函数 b 的逻辑在两个实现中仍然应该相同,尽管我们在 b 内调用 c 可能会得到不同的结果。 p>

我想知道这是否是 go 中的常见模式以及是否有一种优雅的方法来处理它。


解决方案


您想要模拟后期绑定。

实现此目的的一种方法是使用函数指针和实现的构造函数:

type commonimpl struct {
   cimpl func()
}

func (c commonimpl) c() { c.cimpl() }

type firstimpl struct {
   commonimpl
}

func newfirstimpl() apiimpl {
   ret:=firstimpl{}
   ret.cimpl=ret.c
   return &ret
}

通过此实现,您可以调用派生类型 c()

另一种方法是将函数作为参数传递:

func (c commonimpl) c(bfunc func()) {
}

...
x:=firstimpl{}
x.c(x.b)

或者使用接口:

type BIntf interface {
   B()
}

func (c CommonImpl) C(b BIntf) {
}


x:=FirstImpl{}
x.C(x)

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《实现具有相同逻辑的函数接口的方法》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>