2 回答
TA贡献1878条经验 获得超4个赞
因此,通过阅读其他人的 Go 代码和对我的问题的评论中的一些链接,我认为渠道是要走的路。
在我的库代码(半伪代码)中:
// Make a new channel called "Events"
var Events = make(chan
func doSomething() {
// ...
Events <-"abcreceived" // Add "abcreceived" to the Events channel
}
在将使用我的库的代码中:
evt := <-mylib.Events
switch evt {
case "abcreceived":
sendBackDEF()
break
// ...
}
我仍然更喜欢 node.js 的 EventEmitter(因为你可以轻松地将数据传回),但对于简单的事情,这应该就足够了。
TA贡献1829条经验 获得超6个赞
Go 和 Node.js 非常不同。Node.js 仅通过回调支持并发。可能有各种打扮它们的方法,但它们基本上是回调。
在 Node.js 中,没有并行性;Node.js 有一个单线程运行时。当 Node.jsasync
用于实现所谓的“并行”执行时,它不是 Go 中使用的意义上的并行,而是并发。
Go 具有基于通信顺序过程 (CSP) 的显式并发,这是由牛津大学的 Tony Hoare 构想的数学基础。运行时通过将称为 goroutines 的协作进程时间切片到可用的 CPU 内核上来交错它们。在每个 goroutine 中,代码都是单线程的,因此很容易编写。在简单的情况下,goroutines 之间不共享数据;相反,消息沿着通道在它们之间传递。这样就不需要回调了。
当 goroutine 被阻塞等待 I/O 时,这没关系,因为它们在被解除阻塞之前不会使用任何 CPU 时间。它们的内存占用很小,您可以拥有非常多的内存。因此 I/O 操作也不需要回调。
由于 Go 和 Node.js 的执行模型大不相同,因此尝试将代码从一个移植到另一个很可能导致非常笨拙的解决方案。最好从最初的需求出发,从头开始实施。
有可能使用函数参数来扭曲 Go 并发模型,使其表现得像回调。这将是一个坏主意,因为它不是惯用的,并且会失去 CSP 提供的好处。
- 2 回答
- 0 关注
- 170 浏览
添加回答
举报