我总是读到“goto”是什么可怕的东西。但是今天,在阅读 Google 编程语言Go时,我发现它支持协程(Goroutines)。
问题是:
Coroutine == GoTo
或者
Coroutine != GoTo?
为什么?
Goroutine 与 goto 不同——它们与主代码并行运行。当您陈述类似的内容时(来自他们在http://golang.org/doc/effective_go.html的示例)
go list.Sort(); // run list.Sort in parallel; don't wait for it.
主线代码继续 - 它不等待排序完成。排序例程在它自己的轻量级执行线程上启动,当它完成排序时线程退出。
goto 会导致主线代码分支到单独的执行路径 - 因此之后的语句goto
将永远不会运行。
主要区别goto
在于支持它们的语言中的语句允许跳转到程序中的任何位置,几乎没有限制。虽然协程表面上看起来很相似,但它们却非常不同。
协程允许程序被暂停(连同它们的所有上下文)并在某些位置恢复。因此,虽然协程在完成之前会暂停并yield
控制其他程序,然后再恢复,但程序产生和恢复的点是提前知道的。
不可能简单地跳转到过程中的任意行,所讨论的过程必须等待在特定位置恢复。goto
虽然这种控制传递比通过过度使用这种强大的机制来编写令人困惑的代码要结构化得多。那么,不是每个强大的编程语言功能都是如此吗?;-)