Go中下划线(空白标识符)的含义

Jul*_*ian 23 go

在我阅读Go文档时,我发现了这个:

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

type T struct{}
var _ I = T{} // Verify that T implements I.
Run Code Online (Sandbox Code Playgroud)

我不明白_用于什么,我已经在其他任务中看到它,但无法理解它的含义.深入挖掘我发现它被称为"空白标识符",但我不明白它们的用例:

_ = x // evaluate x but ignore it
Run Code Online (Sandbox Code Playgroud)

成语对我来说仍然有点陌生,所以我试图理解为什么我想做这样的事情.

Jam*_*dge 32

_是一个特殊的标识符,您可以分配任何内容但从不读取.在第一个例子中,您给出了:

var _ I = T{}
Run Code Online (Sandbox Code Playgroud)

无法访问此变量,因此将从生成的程序中对其进行优化.但是,如果类型T不能分配给接口,则可能导致编译错误I.所以在这种情况下,它被用作关于类型的静态断言.

第二种情况更为常见.虽然抛弃函数调用的结果似乎很奇怪,但在具有多个返回的函数中它会更有意义.考虑一个foo返回两个值但你只对第一个感兴趣的函数?您可以使用_忽略第二个:

a, _ = foo()
Run Code Online (Sandbox Code Playgroud)

您可以通过创建另一个变量来保持不需要的返回值来获得相同的效果,但此功能意味着您无需担心为其选择唯一的名称.

  • AFAIK,您最后一条语句中的问题不仅在于为不需要的变量选择一个唯一的名称,而且在选择名称后,您还需要使用它。否则 go 编译器会抛出诸如“未使用变量”之类的错误。 (2认同)

Sim*_*ead 11

这在允许多个返回值的语言中很常见.在某些情况下,您实际上并不关心其中一个返回值.

例如,在Go中,通常会返回错误.如果由于某种原因您不关心该错误,您可以选择忽略它:

value, _ := methodThatReturnsValueAndError()
Run Code Online (Sandbox Code Playgroud)

但是,如果您分配它并且不使用它,则会出现编译器错误:

value, err := methodThatReturnsValueAndError()
// if you don't use "err" .. its an error
Run Code Online (Sandbox Code Playgroud)