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
}
我正在对一个 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
}