Go被称为“互联网时代的C语音”,严格意义上不是面向对象编程的语言,但是Go语言结构体和接口的特性可以轻松地实现继承和多态。
0 接口
Go语言有着非常灵活的接口概念,Go语言的接口是隐式实现的,只需简单地定义一些方法就足够了,无需对于给定的具体类型定义所有满足的接口类型。具体可以参考《Go语言圣经——接口》。
1 Go语言实现继承
如下例子,定义一个结构体为Person
,有成员name
和age
,这相当于C++中的成员变量;然后我们定义了方法Speak
,相当于成员函数。结构体Student
包含结构体Person
,其可以继承后者的成员和方法,比C++中的类还要方便。
1 | package main |
执行结果如下:
1 | $ go run main.go |
当然我们也可以定义Student
自己的Speak
方法,如下:
1 | func (s Student) Speak() { |
执行结果如下:
1 | $ go run main.go |
从上可以看出,利用Go语言实现继承是一件很方便的事情。
2 Go语言实现多态
如下例子,我们定义一个名为People
的接口,只需定义Speak
和Working
方法,无需实现该方法。然后对Student
和Teacher
对象都实现了该接口,即实现接口下的所有方法。
1 | package main |
SetPeople
函数接收一个People
接口类型的值,如果一个实体类型实现了该接口,SetPeople
函数会根据不同的类型实体实现不同的行为,这相当于实现了多态。也就是针对一套方法接口,对于不同的类型可以实现不同的行为,执行结果如下:
1 | $ go run main.go |
因为任何用户定义的类型都可以实现任何接口,所以通过不同实体类型对接口值方法的调用就是多态。
3 小结
Go语言虽然没有将自己定位为面向对象的语言,但是Go语言却可以轻松实现面向对象编程的三大基本特征:封装、继承、多态。