规范:变量赋值中空白标识符的用途是什么?

The*_*hat 7 go

我发现了这个变量声明var _ PropertyLoadSaver = (*Doubler)(nil),我想知道它的目的是什么.它似乎没有初始化任何东西,因为它使用空白标识符,我猜你无法访问它.

Cer*_*món 11

这是一个*Doubler类型满足PropertyLoadSaver接口的编译时断言.

如果*Doubler类型不满足接口,则编译将退出,错误类似于:

prog.go:21: cannot use (*Doubler)(nil) (type *Doubler) as type PropertyLoadSaver in assignment:
*Doubler does not implement PropertyLoadSaver (missing Save method)
Run Code Online (Sandbox Code Playgroud)

这是它的工作原理.代码var _ PropertyLoadSaver声明了一个未命名的类型变量PropertyLoadSaver.表达式(*Doubler)(nil)求值为type的值*Doubler.如果实现接口,*Doubler则只能分配给类型变量.PropertyLoadSaver*DoublerPropertyLoadSaver

使用空白标识符_是因为变量不需要在包中的其他位置引用.使用非空标识符可以获得相同的结果:

var assertStarDoublerIsPropertyLoadSaver PropertyLoadSaver = (*Doubler)(nil)
Run Code Online (Sandbox Code Playgroud)