This question already has answers here:
What does an underscore and interface name after keyword var mean?
(2个答案)
2年前关闭。
我发现了这个变量声明
这是它的工作方式。代码
使用空白标识符
(2个答案)
2年前关闭。
我发现了这个变量声明
var _ PropertyLoadSaver = (*Doubler)(nil)
,我想知道它的目的是什么。它似乎没有初始化任何东西,并且因为它使用了空白标识符,所以我想您将无法访问它。 最佳答案
这是*Doubler
类型满足PropertyLoadSaver
接口(interface)的编译时断言。当类型的method set是该接口(interface)的方法集的超集时,该类型将实现一个接口(interface)。
如果*Doubler
类型不能满足接口(interface)要求,则编译将退出,并显示类似以下错误:
prog.go:21: cannot use (*Doubler)(nil) (type *Doubler) as type PropertyLoadSaver in assignment:
*Doubler does not implement PropertyLoadSaver (missing Save method)
这是它的工作方式。代码
var _ PropertyLoadSaver
声明了一个类型为PropertyLoadSaver
的未命名变量。表达式(*Doubler)(nil)
converts将无类型的nil转换为*Doubler
类型的nil值。如果*Doubler
实现PropertyLoadSaver
接口(interface),则只能将*Doubler
分配给PropertyLoadSaver
类型的变量。使用空白标识符
_
是因为不需要在包中的其他位置引用该变量。使用非空白标识符可以实现相同的结果:var assertStarDoublerIsPropertyLoadSaver PropertyLoadSaver = (*Doubler)(nil)
10-06 13:16