为什么在golang中连续声明“var _ I = T {}”和“var _ I =&T {}”?

当我读取docker / distribution源代码的副本时,发现有variables声明,这让我很困惑。 代码是 :

var _ FileInfo = FileInfoInternal{} var _ FileInfo = &FileInfoInternal{} 

我不知道这个声明是什么意思,希望能得到一些帮助。

从常见问题解答 :

您可以让编译器检查Ttypes是否通过尝试赋值来实现接口I:

 type T struct{} var _ I = T{} // Verify that T implements I. 

在这种情况下,空白标识符_代表这里不需要的variables名(从而防止“声明但未使用”的错误)。

从规格更一般:

空白标识符提供了一种忽略赋值中的右侧值的方法:

 _ = x // evaluate x but ignore it x, _ = f() // evaluate f() but ignore second result value 

通过testingFileInfoInternal{}&FileInfoInternal{}您可以检查接口是否使用值接收器来实现。 一个值接收器将同时接受一个值和一个指针,而指针接收器只能使用一个指针,而第一个值的分配将失败。

使用&FileInfoInternal{}的第二个testing实际上并不需要(由作者在注释中确认),因为第一个testing将通过值接收器传递,并且收到指针失败。 因此第二个testing是多余的。

这是一篇很好的文章,解释了值和指针接收器之间的区别以及它们的使用方式。

FileInfo是一个接口 ,代码检查FileInfoInternal是否实现了这个接口。