协同程序和“goto”之间的区别?
我总是读到关于“goto”的恐怖故事。但今天,在阅读有关谷歌编程语言的文章时,我发现它支持协同程序(Goroutines) 问题是:协同程序和“goto”之间的区别?,go,goto,coroutine,goroutine,Go,Goto,Coroutine,Goroutine,我总是读到关于“goto”的恐怖故事。但今天,在阅读有关谷歌编程语言的文章时,我发现它支持协同程序(Goroutines) 问题是: Coroutine == GoTo 或 为什么?Goroutines与goto不同-它们与主代码并行运行。当你陈述如下(从他们的例子中) 主线代码继续运行-它不会等待排序完成。排序例程在它自己的轻量级执行线程上启动,当它完成排序时,线程退出 goto将导致主线代码分支到一个单独的执行路径-因此,goto之后的语句将永远不会运行。关键区别在于,支持它们的语言中的
Coroutine == GoTo
或
为什么?Goroutines与goto不同-它们与主代码并行运行。当你陈述如下(从他们的例子中) 主线代码继续运行-它不会等待排序完成。排序例程在它自己的轻量级执行线程上启动,当它完成排序时,线程退出
goto将导致主线代码分支到一个单独的执行路径-因此,
goto
之后的语句将永远不会运行。关键区别在于,支持它们的语言中的goto
语句允许在几乎没有限制或没有限制的情况下跳到程序中的任何位置。虽然协同程序表面上看起来很相似,但它们却大不相同
协同程序允许在某些位置暂停(及其所有上下文)并恢复程序。因此,虽然协同程序确实会在其他程序完成之前暂停并<代码>让代码>控制这些程序,然后再继续,但这些程序产生和继续的时间点是提前知道的
不可能简单地跳转到过程中的任意行,相关过程必须在特定位置等待恢复。虽然这种控制传递比使用
goto
要结构化得多,但过度使用这种强大的机制可能会编写混乱的代码。那么,并非所有强大的编程语言功能都是如此?;-) 你也会发现戈罗廷!=协同程序。Goroutine更像是一个线程,具有非常简单的创建和管理。
Coroutine != GoTo?
go list.Sort(); // run list.Sort in parallel; don't wait for it.