持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天,点击查看活动详情
Go语言中没有Class,那么Go是通过什么实现面对对象编程的呢?
文章概览
- 封装
- 继承
- 多态
- 接口
一、封装
Go语言使用结构体对属性封装,结构体中的元素就是成员变量,方法是结构体的方法,而访问控制通过首字母大小写来控制。如下程序定义一个Student“类”,成员变量设置为私有,并给Student类编写公有方法get、set,从而可以在main包中调用。
package student
type Student struct {
name string
}
func (s *Student)Get() string{
return s.name
}
func (s *Student)Set(n string){
s.name = n
}
二、继承和多态
Go语言通过结构体中内嵌匿名类型的方法来实现继承。
多态是不同对象中同种行为的不同实现方式,Go语言中使用接口来实现,如下,不同对象调用doPrint()方法产生了不同的结果,展现了多态的特征。
type People interface {
printAge()
}
type Student struct {
age int
}
func (s *Student) printAge() {
fmt.Println("Student age is :", s.age)
}
type Teacher struct {
age int
}
func (t *Teacher) printAge() {
fmt.Println("Teacher age is :", t.age)
}
func doPrint(p People) {
p.printAge()
}
func main() {
var people People
student := Student{
11,
}
teacher := Teacher{
25,
}
people = &student
people.printAge()
people = &teacher
people.printAge()
doPrint(&student)
doPrint(&teacher)
}
三、接口
接口类型是对其他类型行为的概括与抽象。接口本质上是一种指针类型,通过前面的介绍我们已经知道接口可以用来实现多态,那么接口还有哪些特性呢?
接口的赋值
接口的赋值分为以下两种情况:
- 将实现接口的对象实例赋值给接口。
- 将一个接口赋值给另一个接口。
接口的查询
接口的查询是在程序运行时进行检查的。查询结果要在运行期间才能确定。接口可以通过“接口类型.(type)”来判断接口指向的是否是type类型,也可以配合switch实现类型判断。
接口的组合
结构体的组合类似结构体与结构体之间的嵌套,直接将接口名写入接口内部即可,还可以在接口中继续定义自己需要的接口方法。