This question already has answers here:
What does an underscore and interface name after keyword var mean?

(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