我已经阅读了大部分 Go 教程,但我仍然不清楚 Go 的接口编程模型与 OOP 相比如何?
有人可以解释我如何开始“用 Go 思考”吗?
我很困惑如何定义接口,然后基于接口创建对象?
Go 是否在编译期间为您隐式创建具体实现?
OOP 通常试图解决的问题之一是多态性或两个不同类具有行为相同的实例的能力。通常在 OOP 中,这是通过使用继承来完成的。基类定义了其他类扩展的最小接口。Base 类的所有子类都可以用作 Base 类。
Go 不是通过继承而是使用接口来做同样的事情。接口是行为的“描述”。通过实现接口中描述的每个方法,由 Go 中的各个类型来满足此描述。如果一个类型确实实现了接口中描述的所有方法,那么它会自动满足接口并且可以由编译器自动转换为该接口。
Go 的接口系统类似于结构类型。考虑一段python代码:
def foo(bar):
bar.baz(5)
在这个片段中,我们不知道具体类型bar
是什么,但我们可以说它必须有一个baz
接受单个int
参数的方法。请注意,当我们编写类时,bar
我们不必声明我们正在实现这个“接口”(有一个baz
接受整数的方法)。我们只需编写一个baz
在使用单个调用时可以正常工作的方法,int
我们可以将一个实例传递给该foo
方法。
Go 以类似的方式工作,但在编译时会检查所有内容。在 Python 中,如果我们将foo
一个没有方法的类的实例传递给我们的方法,baz
我们会得到一个运行时异常。在 Go 中,我们将定义一个接口,其baz
方法和状态的类型foo
为该接口的实例。现在,任何baz
在单个上具有方法int
的类型都可以满足所需的类型foo
。
传统(Java)OO 是关于类层次结构的。你用类、一些抽象、一些最终和接口来建模你的问题。然后你提供实现。
Go 让您可以反过来:从具体类型开始并实现您的逻辑。如果出现或需要有用的抽象:将其打包到接口中并重构代码以使用此接口类型。