Различия между сопрограммами и "goto"? - PullRequest
10 голосов
/ 12 ноября 2009

Я всегда читал об ужасной вещи, которая есть "goto". Но сегодня, читая о языке программирования Google Go , я вижу, что он поддерживает сопрограммы (Goroutines).

Вопрос:

Coroutine == GoTo 

Или

Coroutine != GoTo?

Почему?

Ответы [ 2 ]

17 голосов
/ 12 ноября 2009

Запрограммированы не то же самое, что goto - они работают параллельно с основным кодом. Когда вы заявляете что-то вроде (из их примера на http://golang.org/doc/effective_go.html)

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

код основной линии продолжается - он не ожидает окончания сортировки. Процедура сортировки запускается в своем собственном облегченном потоке выполнения, и когда она завершает сортировку, этот поток завершается.

Goto приведет к переходу основного кода на отдельный путь выполнения, поэтому операторы после goto никогда не будут запущены.

8 голосов
/ 12 ноября 2009

Ключевым отличием является то, что операторы goto на языках, которые их поддерживают, позволяют переходить в любое место в программе практически без ограничений. Хотя сопрограммы на первый взгляд могут показаться похожими, они очень разные.

Сопрограммы позволяют приостанавливать (со всем их контекстом) процедуры и возобновлять их в определенных местах. Таким образом, в то время как сопрограммы делают паузу и yield контролируют другие процедуры, прежде чем они завершатся, а затем возобновят позже, точки, в которых процедуры завершаются и возобновляются, известны заранее.

Невозможно просто перейти к произвольной строке в процедуре, рассматриваемая процедура должна ждать возобновления в определенном месте. Несмотря на то, что передача управления намного более структурирована, чем с goto, можно написать непонятный код, используя этот мощный механизм. Опять же, разве это не так со всеми мощными функциями языка программирования? ; -)

...