为了账号安全,请及时绑定邮箱和手机立即绑定

高浪包接口

高浪包接口

Go
有只小跳蛙 2022-09-26 14:50:05
我对golang有点陌生,我有一个关于包和接口的问题。如果我有packue1,它需要使用一个接口的实现,将来可以与其他实现交换,这可能吗?一些伪代码包实现包含接口的当前实现type TestI interface {   M1()}package implementationtype Impl struct {}funct (i *Impl) M1 ( ... do something )package package1import TestI somehow and call M1 method but with flexibility to swap it with other implementation of this interface in future?包包1应该在不知道的情况下使用实现(就像c#或java中的DI一样,包应该只知道接口,而不知道实现)TestI接口应该在哪里定义?抱歉,如果这有点令人困惑,只是想让我的头脑绕过它。这在 c 中是等效的#ITest {  SetClass(Class1 cl);}// package1class Class1 {  private ITest test {get; set;}  public void SomeMethod() {// i want to somehow set this in other package    test.SetClass(this);  }}// package2class Test implements ITest { private Class1 cl;SetClass(Class1 c) { this.c1 = c;}}
查看完整描述

1 回答

?
SMILET

TA贡献1796条经验 获得超4个赞

除非您正在编写接口优先的应用程序,否则通常最好在不声明任何接口的情况下编写具体实现。然后,该包的用户可以声明必要的接口。例如:


type Implementation struct {

   ...

}


func (i Implementation) FuncA() {...}

func (i Implementation) FuncB() {...}

如果需要实现的某个类型,则可以声明:FuncA


type IntfA interface {

   FuncA()

}

具有该方法的任何类型都实现 ,并且符合该说明,因此您可以将 的实例传递给需要 的函数。FuncAIntfAImplementationImplementationIntfA


同样,如果您需要一个同时包含 和 的接口,则可以声明:FuncAFuncB


type IntfAB interface {

   FuncA()

   FuncB()

}

并实现 .ImplementationIntfAB


因此,理想情况下,您将在使用它的位置声明所需的接口,并且具有一组匹配方法的任何类型都可用于该接口的实现。


如果您基于现有接口编写,则可以将该接口放在与实现不同的包中,或者可以将接口和实现保留在同一包中,以对您的用例更有意义为准。


查看完整回答
反对 回复 2022-09-26
  • 1 回答
  • 0 关注
  • 99 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信