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
原文地址:https://www.cnblogs.com/perkins/p/15625629.html