Golang包接口

Golang包接口,go,Go,我对golang有点陌生,我对包和接口有一个问题。 若我有package1,那个么需要使用一个接口的实现,这个接口将来可以和其他实现交换,这可能吗 一些伪代码 包实现包含接口的当前实现 type TestI interface { M1() } 包package1应该在不知道实现的情况下使用实现(类似于c#或java中的DI,包应该只知道接口,而不知道实现) TestI接口应该在哪里定义?抱歉,如果这有点让人困惑,我只是想让我的头脑清醒一下 这在c中是等价的# 除非您先编写接口应用程序,

我对golang有点陌生,我对包和接口有一个问题。 若我有package1,那个么需要使用一个接口的实现,这个接口将来可以和其他实现交换,这可能吗

一些伪代码

包实现包含接口的当前实现

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
use
TestI
的地方,所以将来如果你替换具体类型,你就不需要更新所有的用法。还要注意,函数应该返回具体类型。但是在使用返回值时,您可以将它们分配给接口变量。问题是什么?
type Implementation struct {
   ...
}

func (i Implementation) FuncA() {...}
func (i Implementation) FuncB() {...}
type IntfA interface {
   FuncA()
}
type IntfAB interface {
   FuncA()
   FuncB()
}