Go是否具有与node.js等效的等价物。 "发射极"
我自己教我去写一个我写的node.js库。在节点版本中,一旦发生某些事情,该库就会发出一个事件(例如,它在UDP端口1234上侦听,当接收到" ABC"时,#34; abcreceived"被发出,因此调用代码可以响应必要时(例如发回" DEF")
我已经看过Go中的频道(目前我正在阅读它们),但由于我还不熟悉这种语言,我不知道是否(或如何,就此而言) )可用于与使用我的库的任何代码进行通信。
我也见过https://github.com/chuckpreslar/emission,但我不确定这是否可以接受,或者是否有更好的(&#34;最佳实践&#34;)做事方式。< / p>
答案 0 :(得分:1)
因此,通过阅读其他人的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(因为你可以轻松地传回数据)但是对于简单的事情,这应该足够了。
答案 1 :(得分:1)
Go和Node.js非常不同。 Node.js仅通过回调支持并发。可能有各种各样的方法来打扮它们,但它们基本上是回调。
在Node.js中,有 no 并行性; Node.js有一个单线程运行时。当Node.js async
用于实现所谓的“并行”执行时,它在Go中使用的意义上并不是并行的,而是并发的。
Concurrency is not parallelism。
Go具有基于通信顺序进程(CSP)的显式并发性,这是牛津大学Tony Hoare设想的数学基础。运行时将称为goroutine的协作进程通过时间切片到可用的CPU内核上进行交错。在每个goroutine中,代码是单线程,因此易于编写。在简单的情况下,goroutines之间没有共享数据;而是消息沿着渠道在它们之间传递。通过这种方式,不需要回调。
当goroutines被阻塞等待I / O时,这没关系,因为他们在解除阻塞之前不会使用任何CPU时间。它们的内存占用很小,你可以拥有非常多的内存。因此,I / O操作也不需要回调。
因为Go和Node.js的执行模型大致不同,尝试将代码从一个移植到另一个很可能会导致非常笨拙的解决方案。最好从原始要求开始,从头开始实施。
可以使用函数参数扭曲Go并发模型,使其行为类似于回调。这将是一个糟糕的主意,因为它不会是惯用的,会失去CSP带来的好处。