Node.js Go有回调概念吗?

Node.js Go有回调概念吗?,node.js,go,Node.js,Go,我发现很多人说Node.js不好是因为回调地狱,而Go好是因为它的同步模型 我觉得Go也可以像Node.js一样进行回调,但是是同步的。尽我们所能 那么,为什么他们在回调透视图中比较Go和Node.js,好像Go不能成为回调地狱一样 或者我误解了Go中回调和匿名函数的含义 我觉得Golang也可以像Node.js一样进行回调,但是是同步的。因为我们可以传递匿名函数并执行闭包操作 那么,为什么他们在回调透视图中比较Golang和Node.js,好像Golang不能成为回调地狱一样 是的,当然也有可

我发现很多人说Node.js不好是因为回调地狱,而Go好是因为它的同步模型

我觉得Go也可以像Node.js一样进行回调,但是是同步的。尽我们所能

那么,为什么他们在回调透视图中比较Go和Node.js,好像Go不能成为回调地狱一样

或者我误解了Go中回调和匿名函数的含义

我觉得Golang也可以像Node.js一样进行回调,但是是同步的。因为我们可以传递匿名函数并执行闭包操作

那么,为什么他们在回调透视图中比较Golang和Node.js,好像Golang不能成为回调地狱一样

是的,当然也有可能在围棋中把事情搞砸。您没有在node.js中看到那么多回调的原因是Go有通信通道,这允许在不使用回调的情况下构造代码


因此,由于存在通道,回调不会经常使用,因此不太可能在回调泛滥的代码中出错。当然,这并不意味着您也不能用通道编写可怕的代码…

很多事情都需要时间,例如等待网络套接字、文件系统读取、系统调用等。因此,许多语言,或者更准确地说,它们的标准库,都包含其函数的异步版本(通常在同步版本之外),以便您的程序能够同时执行其他操作

在node.js中,情况更为极端。它们使用单线程事件循环,因此需要确保您的程序不会阻塞。它们有一个编写良好的标准库,该库是围绕异步概念构建的,它们使用回调来通知您什么时候准备好了。代码基本上类似于s:

doSomething1(arg1, arg2, function() {
  doSomething2(arg1, arg2, function() {
    doSomething3(function() {
      // done
    });
  });
});
somethingElse();
doSomething1
执行可能需要很长时间(因为它需要从网络中读取),但您的程序仍然可以同时执行
somethingles
。执行
doSomething1
后,您希望调用
doSomething2
doSomething3

另一方面,Go基于Goroutine和Channel的概念(如果你想了解更多关于抽象概念的信息,谷歌称之为“通信顺序进程”)。Goroutine非常便宜(你可以让数千个Goroutine同时运行)因此,您可以在任何地方使用它们。在Go中,相同的代码可能如下所示:

go func() {
  doSomething1(arg1, arg2)
  doSomething2(arg1, arg2)
  doSomething3()
  // done
}()
somethingElse()
node.js只关注于提供异步API,而Go通常鼓励您只编写同步API(无回调或通道)。对
doSomething1
的调用将阻止当前goroutine,
doSomething2
将仅在
doSomething1
完成后执行。但这在Go中不是问题,因为通常可以计划在系统线程上运行其他goroutine。在这种情况下,
somethingElse
是是另一个goroutine的一部分,可以同时执行,就像node.js示例中一样


我个人更喜欢Go代码,因为它更易于阅读和推理。Go的另一个优点是,它也能很好地处理计算量大的任务。如果在node.js中启动一个不需要等待文件系统调用网络的大量计算,则此计算基本上会阻塞事件循环。另一方面,Go的调度程序我会尽最大努力在几个系统线程上调度goroutine,如果您的CPU支持,操作系统可能会并行运行这些线程。

哈哈,没有理由不能在goroutine中嵌套goroutine,然后您就可以回调了,对吗?或者go不允许您这么做。@alexander mills:nesting goroutines does不会创建回调。它只会“并行”执行所有例程(前提是有足够的内核),忘记启动回调是Node.js中的一个常见问题,即使使用TypeScript静态键入也无法轻松解决该问题