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

将接口的定义与其实现分离

将接口的定义与其实现分离

Go
一只名叫tom的猫 2022-05-23 16:18:05
在 Tour of Go 的过程中,出现了以下摘录,但我无法理解它(我猜我缺乏 OOP 知识)。Go 中的接口被定义为一组方法签名。在 Go 中,接口是隐式的。因此,无需在给定类型上定义它实现某个接口。这样做的好处是接口的定义与其实现分离,然后可以在没有预先安排的情况下出现在任何包中。优势如何decoupling a definition of an interface from its implementation?我最初的想法是,这种方法大大降低了接口的“刚性”(也就是重要性)。它只是语法糖,事情实际上在引擎盖下“正常工作”吗?感谢您的时间。
查看完整描述

1 回答

?
翻翻过去那场雪

TA贡献2065条经验 获得超14个赞

这称为“鸭子类型”,它允许在需要的地方定义接口,而不是作为数据类型本身的一部分。考虑以下类型:


type X struct {...}


func (X) f()

func (X) g()

func (X) h()

该类型X具有三种方法,f(), g(), h()。如果你有一个数据结构或函数需要调用一个f()方法,你可以定义一个接口:


type FIntf interface {

   f()

}

现在X实现该接口。X您可以传递需要的任何地方的实例FIntf。


如果在另一个模块中你需要g()and h(),你可以在那里定义一个接口:


type GIntf interface {

  g()

  h()

现在X实现GIntf.


如果您有一个没有实现您需要的接口的第三方库,这将特别有用。您可以在使用它的地方简单地定义一个接口,并使用具有正确方法集的第三方类型来实现您的接口。


这种方法的主要优点是您仍然可以模拟传统的接口概念,您可以在其中定义接口及其具体实现。最重要的是,您可以根据需要灵活地定义不同的接口,而无需修改实现。在像 Java 这样的语言中,如果您有一个获得特定接口的函数,而您的对象没有,那么即使方法集存在于原始类型上,您也必须编写一个适配器。在 Go 中,您不需要这样做。


在调用方法时,鸭子类型也允许类型安全。例如,如果您有一个必须调用方法x()及其y()参数之一的函数,请定义一个包含x()and的接口y(),并使用类型断言来验证参数是否实现了这两个方法。


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

添加回答

举报

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