文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
接口类型
接口类型指定了一个方法集。一个接口类型变量可以保存任何方法集是该接口超集的类型。我们可以认为类型实现了接口。没有初始化的接口类型值为 nil。
InterfaceType = "interface" "{" { MethodSpec ";" } "}" .
MethodSpec = MethodName Signature | InterfaceTypeName .
MethodName = identifier .
InterfaceTypeName = TypeName .
在接口类型的方法集中,每个方法的名称必须是非空且唯一。
// A simple File interface
interface {
Read(b Buffer) bool
Write(b Buffer) bool
Close()
}
接口可以由多个类型实现,例如:类型 S1
和类型 S2
都有以下方法集:
func (p T) Read(b Buffer) bool { return … }
func (p T) Write(b Buffer) bool { return … }
func (p T) Close() { … }
(这里的类型 T 可以表示 S1
也可以表示 S2
) S1
和 S2
都实现了接口 File
,而不用管类型是否还有其他方法。
一个类型实现了任何方法集的为其子集的接口。因此它可能实现了多个不同接口。例如:所有的类型都实现了空接口:
interface{}
与之相似,思考下面这个定义为 Locker
的接口:
type Locker interface {
Lock()
Unlock()
}
如果 S1
和 S2
也实现了它:
func (p T) Lock() { … }
func (p T) Unlock() { … }
那它们就实现了两个接口 Locker
和 File
。
一个接口 T 可以使用另一个接口 E 来指定方法。这种方式叫做将接口 E 嵌入进接口 T。它把 E 中所有的方法(包括导出和未导出的方法)全部添加进接口 T。
type ReadWriter interface {
Read(b Buffer) bool
Write(b Buffer) bool
}
type File interface {
ReadWriter // 与添加 ReadWriter 接口中的方法是等价的
Locker // 与添加 Locker 接口中的方法是等价的
Close()
}
type LockedFile interface {
Locker
File // 无效: Lock, Unlock 不是唯一的
Lock() // 无效: Lock 不是唯一的
}
接口 T 不能递归的嵌入进自己或已经嵌入过它的接口。
// 无效: Bad 不能嵌入它自己
type Bad interface {
Bad
}
// 无效: Bad1 不能嵌入已经引用它的 Bad2
type Bad1 interface {
Bad2
}
type Bad2 interface {
Bad1
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论