21天从Java转向Go之第八天——水滴石穿(接口)
Posted 永恒之光
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了21天从Java转向Go之第八天——水滴石穿(接口)相关的知识,希望对你有一定的参考价值。
接口
- 一个接口类型定义了一套方法,如果一个具体类型要实现该接口,那么必须实现接口类型定义中的所有方法。
接口声明
- 接口字面量语法
interface {
MethodSignature1
MethodSignature2
}
- 接口命名类型使用Type
type InterfaceName interface{
MethodSignature1
MethodSignature2
}
-
空接口 interface{}
-
接口的命名一般以“er ”结尾
-
接口定义的方法声明不需要func引导
-
在接口定义中,只有方法声明没有方法实现。
接口初始化
-
实例赋值接口,如果具体类型的实例的方法集是某个接口的方法集的超集,则该具体类型实现了接口,可将该类型的具体实例赋值给接口类型的变量。接口被初始化后,调用接口的方法就相当于调用接口绑定的具体类型的方法。
-
接口变量赋值给接口变量
已经初始化的接口类型变量a 直接赋值给另一种接口变量b ,要求 b方法集是a 的方法
的子集。此时 Go 编译器会在编译时进行方法集静态检查。这个过程也是接口初始化的
方式,此时接口变量b绑定的具体实例是接口变量a绑定的具体实例的副本。
接口方法调用
- 接口方法调用和普通的函数调用是有区别的。接口方法调用的最终地址是在运行期决定的,将具体类型变量赋值给接口后,会使用具体类型的方法指针初始化接口变量,当调用接口变量
的方法时,实际上是间接地调用实例的方法。接口方法调用不是一种直接的调用,有一定的运
行时开销。直接调用未初始化的接口变量的方法会产生panic。
接口的动态类型和静态类型
- 动态类型:接口绑定的具体实例的类型称为接口的动态类型。接口可以绑定不同类型的实例,
- 静态类型:接口定义时,其类型已经被确定。这个类型叫做接口的静态类型。接口的静态类型在其定义时就被确定,静态类型的本质特征就是接口的方法签名集合。
接口的运算
类型断言
i.(TypeName)
- i必须是接口变量,如果TypeName是一个具体类型名,则类型断言用于判断接口变量i绑定的实例类型是否就是具体类型。如果是接口类型名,则类型断言用于判断接口变量i绑定的实例类型是否同时实现了TypeName接口
接口断言的两种语法
- 直接赋值模式
o:=i.(TypeName)
- comma,ok表达式
if v,ok := i.(TypeName);ok {
}
类型查询
switch type := i.(TypeName)
case type`:
xxx
case type2:
xxx
default:
xxx
以上是关于21天从Java转向Go之第八天——水滴石穿(接口)的主要内容,如果未能解决你的问题,请参考以下文章