编译时检查类型是否满足接口

接口和实现(实现接口的类型)是分离的。因此,如果类型实现接口,如何在编译时检查是一个合法的问题。

要求编译器检查 T 类型实现接口 I 的一种方法是尝试使用 T 的零值或 T 的指针进行赋值。我们可以选择分配空白标识符以避免不必要的垃圾:

type T struct{}

var _ I = T{}       // Verify that T implements I.
var _ I = (*T)(nil) // Verify that *T implements I.

如果 T*T 没有实现 I,那将是编译时错误。

这个问题也出现在官方 FAQ 中: 我如何保证我的类型满足界面?