我对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
因此,理想情况下,您将在使用它的位置声明所需的接口,并且具有一组匹配方法的任何类型都可用于该接口的实现。
如果您基于现有接口编写,则可以将该接口放在与实现不同的包中,或者可以将接口和实现保留在同一包中,以对您的用例更有意义为准。
- 1 回答
- 0 关注
- 99 浏览
添加回答
举报
0/150
提交
取消