我有两个用go
编写的接口,一个是另一个的子集
type x interface {
a()
}
type y interface {
a()
b()
}
我也有一个具有这样方法的结构
type z struct {
some string
}
func (s z) a() {
// do stuff
}
func (s z) b() {
// do stuff
}
对此我有几个问题,
我试图问一些同事,尽管他们不太确定,他们似乎倾向于polymorphism
作为答案。 wikipedia entry表示多态性,“它是为不同类型的实体提供单个接口”,但这对我来说就像直接相反。我还在其他来源(例如this)中发现Go是“不是一种真正的OOP语言”。
答案 0 :(得分:7)
是的,z
同时实现了x
和y
。您可以通过使用变量声明为接口类型分配具体类型来证明这一点:
var _ x = z{}
var _ y = z{}
这使您可以进行编译时检查,以确保类型实现您想要的接口。
请注意,如果您明确希望y
为x + some more methods
,则可以这样写:
interface y {
x
b()
}
关于命名,如果一个类型实现了两个共享某些方法的不同接口,我就称其为-一个实现两个不同接口的类型。一个接口是另一个接口的子集也没关系。
此外,在Go中,类型(以及非结构类型)在定义接口时也未与接口关联。即使没有编写用于实现某种接口的类型,也可以通过定义具有不同名称和/或该类型的方法的不同组合的新接口,来使实现任何数量的接口。这使得为这个概念起一个名字变得更加困难-当以后在另一个包中定义接口时,如何在类型定义时知道这个名字?
答案 1 :(得分:1)
一开始我很难理解Go接口。我来自Java,C ++,Python方面的多年经验。恕我直言,充分利用Go的最佳方法,以及其他任何新语言,也不是用Go语法编写Java或C ++。了解Go中的工作原理并使用它。术语可能不是精确的一对一映射,这并不重要。
将Go接口想像为一组对某些数据(结构)进行操作的方法签名。 类似于 Java接口只是类上的一组方法签名。主要区别在于,在Go中,您不是需要指定struct implements
接口,语言将为您完成此操作。如果在结构上指定方法,则它将自动实现接口。
答案 2 :(得分:0)
您正确地说z实现了两个接口。
接口本身是一个通用的编程概念,并不面向对象的语言。一些面向对象的语言(例如Java和Go)提供了一种定义和实现接口的方法,而另一些则没有。
实际上这是一种多态性,因为您说的是一组特定的函数或方法可以由不同的数据结构类型实现。就像维基百科的文章所建议的那样。也可以将其视为类型抽象。
Go能够支持面向对象和面向过程的编程风格。它被认为是一种面向对象的编程语言。
Go是一种强类型化的语言,除了通过数据结构定义类型的其他方式之外,Go的接口还允许Go程序员通过其方法定义类型。
答案 3 :(得分:0)
Go 中没有继承的概念。并且它促进了组合而不是继承。
来自 Go 常见问题解答:
没有类型层次结构:类型就是存在的,它们不必声明它们的关系。这些简化让 Go 在不牺牲复杂性的情况下具有表现力且易于理解。