我一直在从github.com/lib/pq中阅读一些Golang代码,该代码提供了与Postgres数据库进行交互的驱动程序。
在我碰到的代码中this:
go func() {
select {
case <-done:
_ = cn.cancel()
finished <- struct{}{}
case <-finished:
}
}()
取消功能looks like:
func (cn *conn) cancel() error
据我所知,下划线并未被用作关于类型的静态断言(因此,据我所知,编译器不会评估任何副作用(as in this example))而且它不是作者可能想要丢弃的第二个参数。
总结:为什么将取消功能(错误)的结果分配给下划线?
答案 0 :(得分:5)
代码必须正确。为了确保代码正确,代码必须可读。
第一个执行规则:检查错误。
func (cn *conn) cancel() error
如果我写
cn.cancel()
我是否忘记检查错误,还是决定放弃错误值?
但是,如果我写
_ = cn.cancel()
我没有忘记检查错误,因此决定放弃该错误值。
The Go Programming Language Specification
空白标识符
空白标识符由下划线字符_表示。它 充当匿名占位符,而不是常规(非空白) 标识符,并在声明中具有特殊含义(作为操作数),以及 在作业中。
任务
空白标识符提供了一种忽略右侧值的方法 在作业中:
答案 1 :(得分:3)
空白标识符“ _”是特殊的匿名标识符。在这种情况下,在赋值中使用时,它提供了一种显式忽略右侧值的方法。因此,开发人员已决定忽略/丢弃此方法调用返回的错误。
他们这样做的一些原因(基于对方法调用和上下文的快速浏览,我的猜测是3或4):