协程和`goto`之间的区别?
Posted
技术标签:
【中文标题】协程和`goto`之间的区别?【英文标题】:Differences between Coroutines and `goto`? 【发布时间】:2010-12-15 15:31:30 【问题描述】:我总是读到“goto”是什么可怕的东西。但是今天,读到谷歌编程语言Go,我发现它支持协程(Goroutines)。
问题是:
Coroutine == GoTo
或者
Coroutine != GoTo?
为什么?
【问题讨论】:
你还会发现 Goroutine != Coroutine。 Goroutine 更像是一个创建和管理非常简单的线程。 golang.org/doc/effective_go.html#goroutines 【参考方案1】:Goroutine 与 goto 不同——它们与主代码并行运行。当您陈述类似(来自他们在http://golang.org/doc/effective_go.html 的示例)
go list.Sort(); // run list.Sort in parallel; don't wait for it.
主线代码继续 - 它不等待排序完成。排序例程在其自己的轻量级执行线程上启动,当它完成排序时线程退出。
goto 会导致主线代码分支到单独的执行路径 - 因此goto
之后的语句将永远不会运行。
【讨论】:
【参考方案2】:主要区别在于支持它们的语言中的goto
语句允许在很少或没有限制的情况下跳转到程序中的任何位置。虽然协程表面上看起来很相似,但它们却非常不同。
协程允许程序在某些位置暂停(及其所有上下文)和恢复。因此,虽然协程在完成之前会暂停并yield
控制其他程序,然后稍后再恢复,但程序产生和恢复的点是提前知道的。
不可能简单地跳转到程序中的任意行,所讨论的程序必须等待在特定位置恢复。虽然这种控制传递比goto
更有条理,但过度使用这种强大的机制可能会编写出令人困惑的代码。那么,不是每个强大的编程语言功能都是如此吗? ;-)
【讨论】:
以上是关于协程和`goto`之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章