一:面向对象
[1] Golang语言面向对象编程说明:
(1) Golang也支持面向对象编程(OOP),但是和传统的面向对象编程有区别,并不是纯粹的面向对象语言。所以我们说Golang支持面向对象编程特性是比较准确的。
(2) Golang没有类(class), Go语言的结构体(struct)和其它编程语言的类(class)有同等的地位,你可以理解Golang是基于struct来实现OOP特性的。
(3) Golang面向对象编程非常简洁,去掉了传统OOP语言的方法重载、构造函数和析构函数、隐藏的this指针等等
(4) Golang仍然有面向对象编程的继承,封装和多态的特性,只是实现的方式和其它OOP语言不一样,比如继承:Golang没有extends关键字,继承是通过匿名字段来实现。
[2]结构体的定义:
结构体的定义使用关键字 struct
,可以包含多个字段(成员),每个字段都有名称和类型。
type 结构体名 struct{
//注意字段名大写,外界可以访问这个属性
字段名 字段类型
字段名 字段类型
字段名 字段类型
......
}
[3]结构体之间的转换
结构体是用户单独定义的类型,和其它类型进行转换时需要有完全相同的字段(名字个数和类型)
结构体进行type重新定义(相当于取别名), Golang认为是新的数据类型,但是相互间可以强转
[4]方法:
方法是作用在指定的数据类型上、和指定的数据类型绑定,因此自定义类型,都可以有方法,而不仅仅是struct
方法的声明和调用格式:
func (接收者变量 接收者类型) 方法名(参数列表) 返回值类型 {
// 方法体
}
//接收者类型---结构体
注:
(1)结构体类型是值类型,在方法调用中,遵守值类型的传递机制,是值拷贝传递方式
(2)如程序员希望在方法中,力改结构体变量的值,可以通过结构体指针的方式来处理
底层是指针,底层编译器做了优化,底层会自动帮我们加上& *
(3) Golang中的方法作用在指定的数据类型上的,和指定的数据类型绑定,因此自定义类型,都可以有方法,而不仅仅是struct, 比如int ,float32等都可以有方法
(4)方法的访问范围控制的规则,和函数一样。方法名首字母小写,只能在本包访问,方法首字母大写,可以在本包和其它包访问。
(5)如果一个类型实现了String()这个方法,那么fmt. Println默认会调用这个变量的String()进行输出
[6]函数和方法的区别
(1)绑定指定类型:
方法:需要绑定指定数据类型
函数:不需要绑定数据类型
(2)调用方式不一样:
函数的调用方式:
函数名(实参列表)
方法的调用方式:变量.方法名(实参列表)
(3)对于函数来说,参数类型对应是什么就要传入什么。
(4)对于方法来说,接收者为值类型,可以传入指针类型,接受者为指针类型,可以传入值类型。
[7]封装
[1]什么是封装: } |
[8]继承
[1]继承: [3]注: (1)结构体可以使用嵌套匿名结构体所有的字段和方法,即:首字母大写或者小写的字段、方法,都可以使用。 (4) Golang中支持多继承:如一个结构体嵌套了多个匿名结构体,那么该结构体可以直接访问嵌套的匿名结构体的字段和方法,从而实现了多重继承。为了保证代码的简洁性,建议大家尽量不使用多重继承,很多语言就将多重继承去除了,但是Go中保留了。 (7) 嵌套匿名结构体后,也可以在创建结构体变量(实例)时,直接指定各个匿名结构体字段的值。 |
[9]接口
[1]接口: (1)接口本身不能创建实例,但是可以指向一一个实现了该接口的自定义类型的变量。 |
[10]多态
[1]基本介绍 变量(实例)具有多种形态。面向对象的第三大特征,在Go语言,多态特征是通过接口实现的。可以按照统一的接口来调用不同的实现。这时接口变量就呈现不同的形态。 [2]接口体现多态特征 1)多态参数 2)多态数组 |
[11]断言
[1]什么是断言? Go语言里面有一个语法,可以直接判断是否是该类型的变量: 变量的值, ok = interface变量.(断言的类型),ok是一 个bool类型。 [2] Type Switch的基本用法 Type Switch是Go语言中一种特殊的switch语句,它比较的是类型而不是具体的值。它判断某个接口变量的类型,然后根据具体类型再做相应处理。 |