返回介绍

接口类型

发布于 2024-10-12 12:51:49 字数 2019 浏览 0 评论 0 收藏 0

接口类型指定了一个方法集。一个接口类型变量可以保存任何方法集是该接口超集的类型。我们可以认为类型实现了接口。没有初始化的接口类型值为 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 也可以表示 S2S1S2 都实现了接口 File ,而不用管类型是否还有其他方法。

一个类型实现了任何方法集的为其子集的接口。因此它可能实现了多个不同接口。例如:所有的类型都实现了空接口:

interface{}

与之相似,思考下面这个定义为 Locker 的接口:

type Locker interface {
	Lock()
	Unlock()
}

如果 S1S2 也实现了它:

func (p T) Lock() { … }
func (p T) Unlock() { … }

那它们就实现了两个接口 LockerFile

一个接口 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文