将返回错误分配给下划线

Assigning the returning error to an underscore

我一直在阅读来自 github 的一些 Golang 代码。com/lib/pq 它提供了与 postgres 数据库交互的驱动程序。

我遇到的代码中 this:

go func() {
    select {
    case <-done:
        _ = cn.cancel()
        finished <- struct{}{}
    case <-finished:
    }
}()

取消函数looks like:

func (cn *conn) cancel() error

据我所知,下划线并未用作关于类型的静态断言(因此据我所知,编译器不会评估任何副作用(as in this example )) 并且它不是第二个参数,作者可能希望将其丢弃。

总结:为什么将取消函数的结果(错误)分配给下划线?

空白标识符“_”是一种特殊的匿名标识符。当在赋值中使用时,就像这种情况,它提供了一种 显式 忽略右侧值的方法。因此,开发人员已决定 ignore/discard 此方法调用返回的错误。

他们可能这样做的几个原因(基于对方法调用和上下文的快速浏览,我猜是 3 或 4):

  1. 方法调用保证在此上下文中成功。
  2. 错误已在方法调用中得到充分处理;没有理由再处理它。
  3. 错误无关紧要(例如相关过程无论如何都会结束,结果将与方法调用成功且没有错误相同)。
  4. 开发人员急于让某些东西正常工作,为了节省时间忽略了错误,然后未能回来处理错误。

代码必须正确。为确保代码正确,代码必须可读。


Go 的第一条规则:检查错误。


func (cn *conn) cancel() error

如果我写

cn.cancel()

我是忘记检查错误还是决定放弃错误值?

但是,如果我写

_ = cn.cancel()

我没有忘记检查错误,我确实决定放弃错误值。


The Go Programming Language Specification

Blank identifier

The blank identifier is represented by the underscore character _. It serves as an anonymous placeholder instead of a regular (non-blank) identifier and has special meaning in declarations, as an operand, and in assignments.

Assignments

The blank identifier provides a way to ignore right-hand side values in an assignment: