扩展 VonC 的答案。
来自问题:
但是为什么在 Go 中没有明确的方法来显示结构符合哪些接口?
其实有一些方法。见Go FAQ: How can I guarantee my type satisfies an interface?
假设我们有以下界面:
type Sayer interface {
Say() string
}
我们想创建一个新的类型来实现它:
type MySayer struct{}
func (ms MySayer) Say() string {
return "Foo"
}
在这种情况下,MySayer 实现了Sayer。为了确保这样做,您可以添加以下行:
var _ Sayer = MySayer{}
如果您输入错误,例如将你的 Say() 方法命名为 Sai(),这将是一个编译时错误。
不过,这只是一个编译时“检查”,它没有记录 MySayer 实现了 Sayer。为此,您可以添加一个“虚拟”方法,其 name 本身 记录了此属性:
type Sayer interface {
Say() string
ImplementsSayer()
}
现在任何类型要实现Sayer,都必须声明一个名为ImplementsSayer()的方法,一眼就能看出它实现了Sayer:
func (MySayer) ImplementsSayer() {}
您甚至不需要命名接收器,因为它没有被使用。该行用简单的英语写成:“MySayer implements Sayer”。
由于这个方法被导出(以大写字母开头),它也出现在文档中,当面告诉你它实现了Sayer。但正如常见问题解答所说:
大多数代码都没有使用这些约束,因为它们限制了界面思想的实用性。但有时,它们对于解决相似接口之间的歧义是必要的。