多态
golang的多态是通过接口实现的
接口体现多态特征
- 多态参数
- 多态数组
接口
是golang面向对象的核心
说明
- interface不能包含任何变量
- golang中的接口不需要显示的实现,只要一个变量实现了接口类型中的所有方法,就意味着实现了这个接口
- 接口里的所有方法都没有方法体,体现了程序设计的多态和高内聚低耦合思想
细节
- interface不能创建实例,可以指向一个实现了该接口的实例(和Java一样)
- 只要是自定义数据类型,就可以实现接口,不仅仅是结构体类型
- 一个自定义类型可以实现多个接口(对golang来说根本不关心实现了哪个接口,只关心方法)
- 一个接口A可以继承多个别的接口(B,C),这时如果要实现A接口,也必须将b,c接口方法全部实现
- interface类型默认是一个指针,接口是引用类型,如果没有对接口初始化就使用,那么输出nil
- interface{}空接口没有任何方法,所以所有类型都实现了空接口(常用于函数形参)我们可以把任何一个变量赋给空接口
类型断言
Go语言中使用接口断言(type assertions)将接口转换成另外一个接口,也可以将接口转换为另外的类型。接口的转换在开发中非常常见,使用也非常频繁。
格式
t = i.(T) // 表示判断i是否指向T类型的变量,如果是就转成T类型并赋值给t变量,否则panic
t,ok = i.(T) // 直接panic不是很友好,这里如果不是那么ok为false,t为T类型的零值
实现某个接口的类型同时实现了另外一个接口,此时可以在两个接口间转换。
类型分支
type-switch 流程控制的语法被看作是类型断言的增强版,和switch-case 流程控制代码块有些相似
switch 接口变量.(type) { // 这里也可以用一个变量接受,switch t := 接口变量.(type)
case 类型1:
// 变量是类型1时的处理
case 类型2:
// 变量是类型2时的处理
…
default:
// 变量不是所有case中列举的类型时的处理
}
同样的,如果传入一个空接口类型参数,type-switch也可以用于判断传入的参数具体实现了哪个接口
error接口
查看Go语言的源码就会发现 error 类型是一个非常简单的接口类型
// The error built-in interface type is the conventional interface for
// representing an error condition, with the nil value representing no error.
type error interface {
Error() string
}
除了之前介绍过的使用errors.New来自定义错误外,我们还可以通过实现error接口,自定义error