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

时间:2015-05-21 07:56:50

标签: go registry docker

当我阅读docker / distribution源代码的副本时,我发现声明的变量让我很困惑。 The code is

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

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

2 个答案:

答案 0 :(得分:18)

来自FAQ

  

您可以要求编译器检查类型T是否实现了   接口I尝试分配:

<ContentControl Content="{Binding YourDataObject}" 
    ContentTemplate="{StaticResource YourDataTemplate}" />

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

更为一般来自spec

  

空白标识符提供了忽略右侧值的方法   在作业中:

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

通过测试_ = x // evaluate x but ignore it x, _ = f() // evaluate f() but ignore second result value FileInfoInternal{},检查接口是否使用值接收器实现。值接收器将接受值和指针,而指针接收器将仅使用指针,并且按值的第一次分配将失败。

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

This是一篇很好的文章,它解释了值和指针接收器之间的区别以及它们如何被很好地使用。

答案 1 :(得分:1)

FileInfointerface,代码会检查此FileInfoInternal implements此接口。