go:interface(接口)
1. 定义
接口定义了一组抽象方法(方法集);
接口中不能定义变量;
type Namer interface { Method1(param_list) return_type Method2(param_list) return_type ... }
永远不要使用一个指针指向一个接口类型,因为它已经是一个指针。
1.1 接口名称
1. 一般以方法名加 [e]r 后缀结尾,比如 Printer、Reader、Writer、Logger;
2. 以 able 后缀结尾,如 Closeable、Cloneable;
3. 以 I 开头(大写的i);
1.2 接口方法
一般接口中的方法比较少,0-3个;
2. 接口类型
go 中的接口一般有两种,一种是包含方法定义的接口,一种是不包含方法定义的空接口;
go 语言实现时用两种结构体表示不同的接口,iface 结构体表示包含方法定义的接口,eface 结构体表示空接口;
3. 接口实现方式
在Java中,实现 接口时通过 implements 接口名 来显示实现接口,并在实现类中实现接口的所有方法;
在 go 中,接口都是隐式实现的,实现类只需要实现接口中的全部方法就隐式实现了这个接口;
3.1 接口方法的实现和调用
接口的方法定义中没有限制方法的接收者为结构体还是结构体指针,接收者类型两者都可以,只能二选一;
根据方法接收者类型和方法传入的参数情况,有以下几种情况:
接收者类型和传入参数类型相同时编译通过理所当然,下面讨论一下两种类型不同的情况;
1. 当接收者类型为结构体时,传入结构体指针编译通过,指针编译通过是因为指针通过解引用可以得到引用指向的结构体;
2. 当接收者类型为结构体指针时,传入结构体编译不通过,因为通过结构体不能找到唯一确定的结构体指向的指针,(纯属瞎猜,这里有答案,没看懂,手动狗头)
4. 接口嵌套
类似Java中的接口继承;
一个接口可以包含一个或者多个其他类型的接口,此时相当于该接口也定义了内嵌接口的方法;
比如接口 File包含了ReadWrite 和 Lock 的所有方法,它还额外有一个 Close() 方法。
type ReadWrite interface { Read(b Buffer) bool Write(b Buffer) bool } type Lock interface { Lock() Unlock() } type File interface { ReadWrite Lock Close() }