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

JCh*_*eng 9 registry go docker

当我读到docker/distribution源代码的副本时,我发现声明的变量让我很困惑. 代码是:

var _ FileInfo = FileInfoInternal{}
var _ FileInfo = &FileInfoInternal{}
Run Code Online (Sandbox Code Playgroud)

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

Iam*_*NaN 21

来自FAQ:

您可以通过尝试赋值来要求编译器检查类型T是否实现了接口I:

type T struct{} 
var _ I = T{}   // Verify that T implements I.
Run Code Online (Sandbox Code Playgroud)

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

规范中更一般:

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

_ = x       // evaluate x but ignore it 
x, _ = f()  // evaluate f() but ignore second result value
Run Code Online (Sandbox Code Playgroud)

通过测试两者FileInfoInternal{},&FileInfoInternal{}您可以检查接口是否使用值接收器实现.值接收器将接受值和指针,而指针接收器将仅使用指针,并且按值的第一次分配将失败.

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

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


归档时间:

查看次数:

1867 次

最近记录:

6 年,4 月 前