这是我参与「第三届青训营 -后端场」笔记创作活动的第4篇笔记
之前一直用java进行后端编程,java本身就是一门面向对象的编程语言,因此用java语言进行后端编程时大多都使用面向对象编程的思想。
而Go语言中没有封装、继承、多态这些概念,需要通过别的方式实现这些功能。
封装
定义:隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读取和修改的访问级别。
Go语言通过方法实现封装
定义Person结构体如下:
type Person struct {
name string
sex byte
age int
}
定义Person的PrintIofoValue()方法 (需要注意,大写则为public,小写则为private)
func (temp Person) PrintInfoValue() {
fmt.Println("tmp = ", temp)
}
则可直接如下调用p对象的方法,实现封装
p := Person{
name: "mike",
sex: 'm',
age: 18,
}
//方法调用
p.PrintInfoValue()
继承
定义:可以使得子类具有父类的属性和方法或者重新定义、追加属性和方法等。
Go语言通过匿名字段实现继承
定义了Student结构体,里面有Person的匿名字段,继承了Person的成员
type Student struct {
Person //只有类型,没有名字,匿名字段,继承了Person的成员
id int
addr string
}
初始化变量
var s1 Student = Student{
Person: Person{"mike", 'm', 18},
id: 1,
addr: "bj",
}
Student也实现了一个方法,这个方法和Person方法同名,这种方法叫重写,重写后调用PrintInfo(),则调用Student的方法,而不是Person的方法
func (temp Student) PrintInfo() {
fmt.Println("student = ", temp)
}
若想调用回Person父类的方法则可用如下方式:
s1.Person.PrintInfo()
多态
定义:为不同数据类型的实体提供统一的接口
Go语言通过接口实现多态
声明以下接口
type Humaner interface {
//方法只有声明,没有实现,由别的类型(自定义实现)
sayhi()
}
//Student实现了该接口
func (temp *Student) sayhi() {
fmt.Println(temp)
}
//定义teacher结构体
type teacher struct {
addr string
group string
}
//teacher也实现该接口
func (temp *teacher) sayhi() {
fmt.Println(temp)
}
则当定义一个普通函数,函数的参数为接口类型
func WhoSayHi(i Humaner) {
i.sayhi()
}
函数内部可传入teacher对象或student对象,根据不同对象可以有不同的表现形式
s := &Student{
name: "mike",
id: 666,
}
t := &teacher{
addr: "bj",
group: "go",
}
WhoSayHi(s)
WhoSayHi(t)
总结
Go语言在编程时也可以通过别的方式实现面向对象的的编程。在实际开发中也通常定义一个空结构体然后定义该空结构体的各种方法来实现封装的功能,提高代码可读性。