协程和`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`之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章

Unity协程和线程的区别

线程和协程有啥区别呢?

Golang 线程和协程的区别

go主线程退出协程还会在内存中吗

Python 的协程和 goroutine 有什么区别?

I/O 多路复用用协程和用线程的区别?