为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
烙印99 2021-09-10 16:28:11
Go 是否相当于 node.js 的“发射器”?我正在通过移植我编写的 node.js 库来自学 Go。在节点版本中,一旦发生某些事情,库就会发出一个事件(例如,它侦听 UDP 端口 1234,当收到“ABC”时,会发出“abcreceived”,因此调用代码可以根据需要做出响应(例如,发回“DEF”)我已经在 Go 中看到了频道(并且目前正在阅读它们),但是由于我对这种语言还是陌生的,我不知道它是否(或如何,就此而言)可以用来与任何东西进行交流代码正在使用我的库。我也看过https://github.com/chuckpreslar/emission,但不确定这是否可以接受,或者是否有更好的(“最佳实践”)做事方式。
查看完整描述

2 回答

?
UYOU

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(因为你可以轻松地将数据传回),但对于简单的事情,这应该就足够了。


查看完整回答
反对 回复 2021-09-10
?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

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 提供的好处。


查看完整回答
反对 回复 2021-09-10
  • 2 回答
  • 0 关注
  • 170 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信