当我阅读 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(使用前将#替换为@)