Go 中的通道和 node.js 中的发射器?

Go 是否相当于 node.js 的“发射器”?

我正在通过移植我编写的 node.js 库来自学 Go。在节点版本中,一旦发生某些事情,库就会发出一个事件(例如,它侦听 UDP 端口 1234,当收到“ABC”时,会发出“abcreceived”,因此调用代码可以根据需要做出响应(例如,发回“DEF”)

我已经在 Go 中看到了频道(并且目前正在阅读它们),但是由于我对这种语言还是陌生的,我不知道它是否(或如何,就此而言)可以用来与任何东西进行交流代码正在使用我的库。

我也看过https://github.com/chuckpreslar/emission,但不确定这是否可以接受,或者是否有更好的(“最佳实践”)做事方式。


烙印99
浏览 171回答 2
2回答

UYOU

因此,通过阅读其他人的 Go 代码和对我的问题的评论中的一些链接,我认为渠道是要走的路。在我的库代码(半伪代码)中:// Make a new channel called "Events"var Events = make(chan&nbsp;func doSomething() {&nbsp; &nbsp; // ...&nbsp; &nbsp; Events <-"abcreceived" // Add "abcreceived" to the Events channel}在将使用我的库的代码中:evt := <-mylib.Eventsswitch evt {&nbsp; &nbsp; case "abcreceived":&nbsp; &nbsp; &nbsp; &nbsp; sendBackDEF()&nbsp; &nbsp; &nbsp; &nbsp; break&nbsp; &nbsp; // ...}我仍然更喜欢 node.js 的 EventEmitter(因为你可以轻松地将数据传回),但对于简单的事情,这应该就足够了。

肥皂起泡泡

Go 和 Node.js 非常不同。Node.js 仅通过回调支持并发。可能有各种打扮它们的方法,但它们基本上是回调。在 Node.js 中,没有并行性;Node.js 有一个单线程运行时。当 Node.jsasync用于实现所谓的“并行”执行时,它不是 Go 中使用的意义上的并行,而是并发。并发不是Go 世界中的并行。Go 具有基于通信顺序过程 (CSP) 的显式并发,这是由牛津大学的 Tony Hoare 构想的数学基础。运行时通过将称为 goroutines 的协作进程时间切片到可用的 CPU 内核上来交错它们。在每个 goroutine 中,代码都是单线程的,因此很容易编写。在简单的情况下,goroutines 之间不共享数据;相反,消息沿着通道在它们之间传递。这样就不需要回调了。当 goroutine 被阻塞等待 I/O 时,这没关系,因为它们在被解除阻塞之前不会使用任何 CPU 时间。它们的内存占用很小,您可以拥有非常多的内存。因此 I/O 操作也不需要回调。由于 Go 和 Node.js 的执行模型大不相同,因此尝试将代码从一个移植到另一个很可能导致非常笨拙的解决方案。最好从最初的需求出发,从头开始实施。有可能使用函数参数来扭曲 Go 并发模型,使其表现得像回调。这将是一个坏主意,因为它不是惯用的,并且会失去 CSP 提供的好处。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go