Coroutines和`goto`之间的区别?

时间:2009-11-11 21:22:23

标签: go goto coroutine goroutine

我总是读到“goto”的可怕之处。但是今天,在阅读Google编程语言Go时,我发现它支持了Coroutines(Goroutines)。

问题是:

Coroutine == GoTo 

或者

Coroutine != GoTo?

为什么?

2 个答案:

答案 0 :(得分:17)

Goroutines与goto不同 - 它们与主代码并行运行。当你陈述类似的东西时(来自他们在http://golang.org/doc/effective_go.html的例子)

go list.Sort();  // run list.Sort in parallel; don't wait for it. 

主线代码继续 - 它不会等待排序完成。排序例程在它自己的轻量级执行线程上启动,并在完成线程退出的排序时启动。

goto会导致主线代码分支到单独的执行路径 - 因此goto之后的语句永远不会运行。

答案 1 :(得分:8)

关键区别在于支持它们的语言中的goto语句允许跳转到程序中的任何位置,几乎没有限制。虽然表面上的协同程序看起来很相似,但它们却非常不同。

协同程序允许暂停程序(包括所有上下文)并在某些位置恢复。因此,虽然协程会在完成之前暂停并yield控制其他程序,然后再恢复,但程序产生和恢复的点是提前知道的。

不可能简单地跳转到过程中的任意一行,所讨论的过程必须等待在特定位置恢复。虽然这种控制的传递比使用goto更加结构化,但是可以通过过度使用这种强大的机制来编写令人困惑的代码。那么每个强大的编程语言功能都不是这样吗? ; - )