宜将剩勇追穷寇,不可沽名学霸王
70多年前,正值蒋家王朝覆灭前夜,革命领袖毛教员大手一挥,打过长江去,彻底结束蒋家王朝在中国大地的统治。兴之所至,大笔一挥:宜将剩勇追穷寇,不可沽名学霸王。诗词本意大致如下:千万不能向西楚霸王一样为了贪图虚名而放走敌人,最终导致失败。前事不忘后事之师,教训古而有之,历史王朝的更迭命运如此,个人编程语言的学习亦如此,有的人在学习的过程中总以为掌握个差不多就行,殊不知好的工程师不仅主干知识掌握扎实,边缘知识同样重视。
go语言中的面向对象
go语言作为一门全新的语言,从某种程度上来讲既可以说是一门支持面向对象的编程语言,也可以说是一门不支持面向对象的语言,之所以可以说是支持面向对象的编程语言是因为go可以实现面向对象的继承、封装、多态的语言属性;不支持是go的面向对象的语言特征不像go语言那般纯正。go的官方的说法是这样的:“可以说是,也可以说不是。虽然 Go 有类型和方法,支持面向对象的编程风格,但却没有类型的层次结构。Go 中的“接口”概念提供了一种不同的方法,我们认为它易于使用,也更为普遍。Go 也可以将结构体嵌套使用,这与子类化(Subclassing)类似,但并不完全相同。此外,Go 提供的特性比 C++ 或 Java 更为通用:子类可以由任何类型的数据来定义,甚至是内建类型(如简单的“未装箱的”整型)。这在结构体(类)中没有受到限制”。
1、go中的对象和构造方法
go语言中不存在面向对象语言中的类,却采用了结构体来代替类,同样也没有面向对象语言的构造方法,却同样的可以采取某种方式来实现构造方法的效果
//举个栗子,结构体Employee相当于面向对象语言中的对象
type Employee struct {
FirstName string
LastName string
TotalLeaves int
LeavesTaken int
}
//构造方法的实现
func New(firstName string, lastName string, totalLeave int, leavesTaken int) employee {
e := employee {firstName, lastName, totalLeave, leavesTaken}
return e
}
func main() {
e := employee.New("Sam", "Adolf", 30, 20)
e.LeavesRemaining()
}
2、面向对象的封装
go语言的封装本质上和其他的编程语言没有什么区别,只不过大部分的情形下go语言的封装是借助方法来实现的
//举个栗子
type Person struct {
name string }
func (person *Person) setName(name string) {
person.name = name
}
func (person *Person) GetInfo() {
fmt.Println(person.name)
}
func main() {
p := Person{"zhangsan"}
p.setName("lisi")
p.GetInfo()
}
3、面向对象的继承
go语言形式上形式上是不支持面向对象的语言的,但是可以通过组合的方式来实现相同功能,也就是说go中继承的实现主要是依靠结构体对象之间的嵌套来实现的。
//举个栗子
type Person struct {
name string }
type Woman struct {
Person
sex string }
func main() {
woman := Woman{Person{"wangwu"}, "女"}
fmt.Println(woman.name)
fmt.Println(woman.sex)
}
4、面向对象的多态
多态的概念可能相对于封装、继承理解上存在一定的难点,简单而言多态就是就是针对同一个事物具有不同的表现形式
//举个栗子
type Eater interface {
Eat()
}
type Man struct {
}
type Woman struct {
}
func (man *Man) Eat() {
fmt.Println("Man Eat")
}
func (woman *Woman) Eat() {
fmt.Println("Woman Eat")
}
func main() {
var e Eater
woman := Woman{}
man := Man{}
e = &woman
e.Eat()
e = &man
e.Eat()
}
总结
go语言的面向对象虽然没有传统面向对象编程语言那样的血统纯正,但是也相对更加的灵活,使用上虽然相对其他的语言有所区别,但是总体而言不是非常的难以理解,因此这部分的内容还是需要下点功夫真正掌握的。