go - Go的selectnbrecv函数到底做什么?

标签 go reverse-engineering

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

最佳答案

它是Go运行时内部实现,用于非阻塞地从 channel 接收:
当 channel 有任何事件时,selectnbrecv函数返回true,否则返回false(对于nil channel ,返回false):
它在 channel 上接收并将接收到的数据写入v(如果&v不为nil,在这种情况下,接收到的数据将被忽略。)如果没有可用数据,则返回false。否则,如果关闭 channel ,则将v归零并返回true。否则,用数据填充v并返回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 - Go的selectnbrecv函数到底做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65266072/

相关文章:

sockets - 在 goroutines 中使用套接字的正确方法是什么

go - 无法从同一区域的 Compute Engine 访问 GCP MemoryStore

go - 编码时转换值

android - 来自 p2p wifi spy 相机的 H264 数据包

go - 结构映射的默认值是什么

git - Vgo 和私有(private)仓库

c++ - 通过 C 中的偏移量调用函数

ios - 获取 iOS 私有(private) API 方法的签名

java - .Net 服务不可用时如何在 java 中测试 .net webservice

c++ - 有没有办法通过逆向工程来恢复结构。指向该结构的指针由 DLL 中唯一用于导出的函数返回