Go有callback概念吗?

我发现很多谈话说Node.js因为callback地狱而不好,而Go则因为它的同步模型而不错。

我觉得Go也可以像Node.js一样以同步的方式进行callback。 因为我们可以通过匿名函数并closures事物

那么,为什么他们在callback的angular度来比较Go和Node.js就好像Go不能成为callback地狱一样。

或者我误解了Go的callback和匿名函数的含义?

很多事情需要时间,例如等待networking套接字,文件系统读取,系统调用等。因此,许多语言,或者更确切地说它们的标准库包括它们的function的asynchronous版本(通常除了同步版本),以便您的程序能够同时做其他事情。

在node.js中,事情更加极端。 他们使用单线程事件循环,因此需要确保您的程序不会阻塞。 他们有一个非常好的标准库,它是围绕asynchronous的概念构build的,他们使用callback函数来通知你什么时候准备好了。 代码基本如下所示:

doSomething1(arg1, arg2, function() { doSomething2(arg1, arg2, function() { doSomething3(function() { // done }); }); }); somethingElse(); 

doSomething1可能需要很长时间才能执行(因为它需要从networking读取),但是您的程序仍然可以同时执行somethingElse操作。 doSomething1被执行后,你想调用doSomething2doSomething3

另一方面,围绕着goroutines和渠道的概念(谷歌的“沟通顺序过程”,如果你想了解更多关于抽象的概念)。 Goroutines非常便宜(您可以同时运行数千个),因此您可以在任何地方使用它们。 Go中的代码可能如下所示:

 go func() { doSomething1(arg1, arg2) doSomething2(arg1, arg2) doSomething3() // done }() somethingElse() 

尽pipenode.js专注于仅提供asynchronousAPI,但Go通常鼓励您只写同步API(不带callback或通道)。 doSomething1的调用将阻止当前的goroutine, doSomething2只会在doSomething1完成后执行。 但是这在Go中并不是问题,因为通常还有其他可用的goroutine可以安排在系统线程上运行。 在这种情况下, somethingElse是另一个goroutine的一部分,可以同时执行,就像在node.js示例中一样。

我个人更喜欢Go代码,因为它更容易阅读和推理。 Go的另一个优点是,它也适用于计算繁重的任务。 如果你在node.js中开始大量的计算,不需要等待文件系统调用的networking,这个计算就会阻止你的事件循环。 另一方面,Go的调度器将尽最大努力在几个系统线程上调度goroutine,如果你的CPU支持的话,OS可能并行地运行这些线程。

我觉得Golang也可以像Node.js一样以同步的方式进行callback。 因为我们可以通过匿名函数并closures事物

那么,为什么他们在callback的angular度上比较Golang和Node.js就好像Golang不能成为callback地狱一样。

是的,当然也可以把Go搞乱了。 为什么在node.js中看不到如此多的callback呢?Go是有通道的通道,它允许在不使用callback的情况下构build代码。

所以,由于有渠道,callback不经常使用,因此不太可能绊倒callback被感染的代码。 当然,这并不意味着你不能写频道的可怕的代码…