我已经阅读了大部分Go巡演教程,但我还不清楚Go的界面编程模型与OOP的比较?
有人可以解释我如何开始'在Go中思考'吗?
我很困惑如何定义界面,然后根据界面创建对象?
在编译期间,Go是否隐式为您创建了具体的实现?
答案 0 :(得分:2)
OOP通常试图解决的问题之一是多态性或两个不同类具有相同行为的实例的能力。通常在OOP中,这是通过使用继承来完成的。 Base类定义了其他类扩展的最小接口。 Base类的所有子类都可以用作Base类。
Go不是通过继承而是使用接口来做同样的事情。界面是行为的“描述”。 Go中的各个类型可以通过实现界面中描述的每个方法来满足此描述。如果Type确实实现了接口中描述的所有方法,那么它会自动满足接口,并且可以由编译器自动强制转换到该接口。
答案 1 :(得分:2)
Go的界面系统类似于structural typing。考虑一段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
所需的类型。
答案 2 :(得分:0)
传统(Java)OO是关于类层次结构的。您可以使用类,一些抽象,一些final和接口来模拟您的问题。然后你提供实现。
Go让你走另一条路:从具体类型开始并实现你的逻辑。如果出现或需要有用的抽象:将其打包到接口中并重构代码以使用此接口类型。