Go 中的 selectnbrecv 函数究竟做了什么?

What exactly does the selectnbrecv function from Go do?

我正在对一个 Go 二进制文件进行逆向工程并遇到函数 selectnbrecv。但是,我不明白documentation。如果有人能向我解释该功能的上下文和操作,我将不胜感激。谢谢!

它是 Go 运行时的内部实现,用于从通道接收非阻塞:
当通道有任何事件时 selectnbrecv 函数 returns true 否则 returns false (对于 nil 通道 returns false): 它在通道上接收并将接收到的数据写入v(如果&v不为零,在这种情况下接收到的数据将被忽略。)如果没有数据可用,returns false.否则,如果通道关闭,则将 v 和 returns true 归零。否则,填写 v 和 returns true.

// compiler implements
//
//  select {
//  case v = <-c:
//      ... foo
//  default:
//      ... bar
//  }
//
// as
//
//  if selectnbrecv(&v, c) {
//      ... foo
//  } else {
//      ... bar
//  }
//
func selectnbrecv(elem unsafe.Pointer, c *hchan) (selected bool) {
    selected, _ = chanrecv(c, elem, false) // false for non blocking
    return
}