Golang包接口
我对golang有点陌生,我对包和接口有一个问题。 若我有package1,那个么需要使用一个接口的实现,这个接口将来可以和其他实现交换,这可能吗 一些伪代码 包实现包含接口的当前实现Golang包接口,go,Go,我对golang有点陌生,我对包和接口有一个问题。 若我有package1,那个么需要使用一个接口的实现,这个接口将来可以和其他实现交换,这可能吗 一些伪代码 包实现包含接口的当前实现 type TestI interface { M1() } 包package1应该在不知道实现的情况下使用实现(类似于c#或java中的DI,包应该只知道接口,而不知道实现) TestI接口应该在哪里定义?抱歉,如果这有点让人困惑,我只是想让我的头脑清醒一下 这在c中是等价的# 除非您先编写接口应用程序,
type TestI interface {
M1()
}
包package1应该在不知道实现的情况下使用实现(类似于c#或java中的DI,包应该只知道接口,而不知道实现)
TestI接口应该在哪里定义?抱歉,如果这有点让人困惑,我只是想让我的头脑清醒一下
这在c中是等价的#
除非您先编写接口应用程序,否则通常最好在编写具体实现时不声明任何接口。然后,该包的用户可以声明必要的接口。例如:
type Implementation struct {
...
}
func (i Implementation) FuncA() {...}
func (i Implementation) FuncB() {...}
如果需要实现FuncA
的某种类型,则可以声明:
type IntfA interface {
FuncA()
}
具有方法FuncA
的任何类型都实现IntfA
,并且Implementation
符合该描述,因此您可以将Implementation
的实例传递给需要IntfA
的函数
类似地,如果您需要同时具有FuncA
和FuncB
的接口,则可以声明:
type IntfAB interface {
FuncA()
FuncB()
}
而Implementation
也实现了IntfAB
因此,理想情况下,您应该在使用它的地方声明所需的接口,并且任何具有匹配方法集的类型都可以用于该接口的实现
如果您是基于现有接口编写的,那么您可以将该接口放在与实现不同的包中,或者您可以将接口和实现放在同一个包中,以对您的用例更有意义的包为准。在Golang中,对于接口实现,无需使用
implements
。您只需实现该接口,它就会被自动检测到。现在,关于如何使用TestI
,以便将来可以交换实现,您可以在任何地方定义TestI
。使用实现时,请确保正在创建Impl
对象并将其分配给TestI
参数。这样,你就到处使用<代码> Stest接口,当你想交换它的实现时,你只需创建一个类型,比如“代码> IMP2”,并将其分配给<代码> Test1< /Cord> PARAM,并将该实现改为新的。Go接口通常属于使用接口类型值的包,而不是实现这些值的包“.Hey@SaiRaviTejaK,您能解释一下这部分吗:确保您正在创建Impl对象并将其分配给TestI参数。围棋是怎么做到的?您的意思是将其指定给函数中的参数?但是如果没有函数,我只想使用它?这意味着我需要创建一个返回接口的函数func Foo()TestI{},然后返回Impl?谢谢@user3728390基本上是在任何你想使用Impl
useTestI
的地方,所以将来如果你替换具体类型,你就不需要更新所有的用法。还要注意,函数应该返回具体类型。但是在使用返回值时,您可以将它们分配给接口变量。问题是什么?
type Implementation struct {
...
}
func (i Implementation) FuncA() {...}
func (i Implementation) FuncB() {...}
type IntfA interface {
FuncA()
}
type IntfAB interface {
FuncA()
FuncB()
}