Golang的面向对象编程
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
Go语言的面向对象之所以与C++,Java以及(较小程度上的)Python这些语言不同,是因为它不支持继承,仅支持聚合(也叫组合)和嵌入。接下来我们一起来学习一下Go语言的面向对象编程吧。
一.面向对象编程思想
面向对象编程刚流行的时候,继承是它首先被吹捧的最大优点之一。但是历经几十载的实践之后,事实证明该特性也有些明显的缺点,特别是当用于维护大系统时。Go语言建议的是面向接口编程。 常见的编程方式: 面向过程(面向函数式编程): 典型代表: C语言 优点: 流程清晰,代码易读。 缺点: 耦合度太高,不利于项目迭代。 面向对象编程: 典型代表: C++,Java,Python,Golang等。 优点: 解耦。 缺点: 代码抽象度过高,不易读。 面向对象三要素: 封装 组装:将数据和操作组装到一起。 隐藏数据:对外只暴露一些接口,通过接口访问对象。比如驾驶员使用汽车,不需要了解汽车的构造细节,只需要知道使用什么部件怎么驾驶就行,踩了油门就能跑,可以不了解其中的机动原理。 继承 多复用,继承来的就不用自己写了。 多继承少修改,OCP(Open-closed Principle),使用继承来改变,来体现个性。 多态 面向对象编程最灵活的地方,动态绑定。 与其它大部分使用聚合和继承的面向对象语言不同的是,Go语言只支持聚合(也叫做组合)和嵌入。
二.结构体的定义及初始化
package main import ( "fmt" ) type Person struct { Name string Age int Gender string } type Student struct { Person //通过匿名组合的方式嵌入了Person的属性。 Score float64 } type Teacher struct { Person //通过匿名组合的方式嵌入了Person的属性。 Course string } type Schoolmaster struct { Person //通过匿名组合的方式嵌入了Person的属性。 CarBrand string } func main() { /** 第一种初始化方式:先定义后赋值 */ s1 := Student{} s1.Name = "Jason Yin" fmt.Println(s1) fmt.Printf("%+v\n\n", s1) //"+v表示打印结构体的各个字段" /** 第二种初始化方式:直接初始化 */ s2 := Teacher{Person{"尹正杰", 18, "boy"}, "Go并发编程"} fmt.Println(s2) fmt.Printf("%+v\n\n", s2) /** 第三种赋值方式:初始化赋值部分字段 */ s3 := Schoolmaster{CarBrand: "丰田", Person: Person{Name: "JasonYin最强王者"}} fmt.Println(s3) fmt.Printf("%+v\n", s3) }
三.面向接口编程