为什么要连续声明“var _ I = T{}”和“var _ I = &T{}”? [复制]

2024-03-05

当我阅读 docker/distribution 源代码的副本时,我发现声明了一些变量,这让我很困惑。代码是 https://github.com/docker/distribution/blob/65b0d73cb749fd9757352f472e399024f1c597df/registry/storage/driver/fileinfo.go#L55-56:

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

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


来自FAQ https://golang.org/doc/faq#guarantee_satisfies_interface:

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

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

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

更一般的是spec https://golang.org/ref/spec#Assignments:

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

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

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

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

This http://jordanorelli.com/post/32665860244/how-to-use-interfaces-in-go是一篇优秀的文章,解释了值接收器和指针接收器之间的区别以及如何很好地使用它们。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么要连续声明“var _ I = T{}”和“var _ I = &T{}”? [复制] 的相关文章

随机推荐