Go面对对象编程

81 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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实现类型判断。

接口的组合

 结构体的组合类似结构体与结构体之间的嵌套,直接将接口名写入接口内部即可,还可以在接口中继续定义自己需要的接口方法。