引言
Golang支持面向对象编程(OOP),但是和传统的面向对象编程有区别,并不是纯粹的面向对象语言,Golang支持面向编程特性(继承、封装、多态)。实现方式与其它OOP语言不一样,比如继承,golang没有extend关键字,继承是通过匿名字段实现的。golang没有类(class), 其结构体(struct)与其它编程语言的类(class)有同等的地位,Golang是基于struct来实现OOP特性的。
1.方法
- 如果一个类型实现了string()这个方法,那么fmt.println默认会使用这个变量的string()进行输出
2. 工厂模式
- golang的结构没有构造函数,通常可以使用工厂模式来解决这个问题,本质是在model包里构造一个函数
- 场景:
package model
type Student struct{
Name string
}
- Student首字母为大写,故可在其他包使用,若首字母小写咋办?使用工厂模式
3.封装
*抽象:把一类事物的共有属性(字段)和行为(方法)提取出来,形成一个物理模型(模板)。这种研究问题的方法称为抽象
- 封装就是把抽象出的字段和字段的操作封装在一起,数据被保护在内部,程序的其他包只有通过被授权的操作(方法),才能对字段进行操作
4. 继承
- 使用匿名结构体实现
5. 接口-实现多态(按照统一的接口来调用不同的实现)
- 接口里的所有方法都没有方法体,即接口的方法都是没有实现的方法。接口体现了程序设计的多态和高内聚、低耦合的思想
- golang中接口,不需要显示实现。只需要一个变量,含有接口类型中的所有方法,那么这个变量就实现这个接口,因此,golang中没有implement这样的关键字
- 一个自定义类型可以实现多个接口,golang中接口不能有任何变量
- 一个接口(比如A接口)可以继承多个别的接口(比如B、C接口),这里要实现A接口,也必须将B、C接口中的方法全部实现
- interface类型默认是一个指针(引用类型),如果没有对interface初始化就使用,那么会输出nil
- 空接口interface{} 没有任何方法,所以所有类型都实现了空接口,即我们可以把任何一个变量赋给空接口
6.接口与继承的区别
- 接口可看作是对继承的一种补充
- 继承的价值主要在于:解决代码的复用性和可维护性;接口的价值在于:设计,设计好各种规范(方法),让其它自定义类型去实现这些方法
7.类型断言
- 由于接口是一般类型,不知道具体类型,如果要转成具体类型,就需要使用类型断言