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:
Run Code Online (Sandbox Code Playgroud)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
通过测试两者FileInfoInternal{},&FileInfoInternal{}您可以检查接口是否使用值接收器实现.值接收器将接受值和指针,而指针接收器将仅使用指针,并且按值的第一次分配将失败.
&FileInfoInternal{}实际上并不需要进行第二次测试(由评论中的作者确认),因为第一次测试将通过值接收器传递并且在接收到指针时失败.因此第二次测试是多余的.
这是一篇很好的文章,它解释了值和指针接收器之间的区别以及它们如何被很好地使用.
| 归档时间: |
|
| 查看次数: |
1867 次 |
| 最近记录: |