猿问

将接口的定义与其实现解耦

在 Tour of Go 的过程中,出现了以下摘录,但我无法理解它的意义(猜想我缺乏 OOP 知识)。

Go 中的接口被定义为一组方法签名。在 Go 中,接口是隐式的。因此不需要在给定类型上定义它实现某个接口。这样做的优点是接口的定义与其实现分离,然后可以出现在任何包中而无需预先安排。

怎么样有decoupling a definition of an interface from its implementation优势?我最初的想法是,这种方法大大降低了接口的“刚性”(也称为重要性)。这只是语法糖,而事情实际上在幕后“正常工作”吗?

感谢您的时间。


HUX布斯
浏览 105回答 1
1回答

慕桂英4014372

这称为“鸭子类型”,它允许在需要的地方定义接口,而不是作为数据类型本身的一部分。考虑以下类型: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()和h(),您可以在那里定义一个接口:type GIntf interface {  g()  h()现在X实现了GIntf。如果您有一个未实现您需要的接口的第三方库,这尤其有用。您可以简单地定义一个使用它的接口,并使用第三方类型和正确的方法集来实现您的接口。此方法的主要优点是您仍然可以模拟传统的接口概念,在其中定义接口及其具体实现。最重要的是,您可以根据需要灵活地定义不同的接口,而无需修改实现。在像 Java 这样的语言中,如果您有一个函数可以获取某个接口,而您的对象没有,则即使原始类型上存在方法集,您也必须编写一个适配器。在 Go 中,你不需要这样做。鸭子类型还允许在调用方法时实现类型安全。例如,如果您有一个函数必须调用 methodx()及其y()参数之一,请定义一个包含x()and的接口y(),并使用类型断言来验证参数是否实现了这两个方法。
随时随地看视频慕课网APP

相关分类

Go
我要回答