私はいつも「goto」の恐ろしいことについて読んでいます。しかし、今日、Google プログラミング言語Goについて読んでみると、それがコルーチン (ゴルーチン) をサポートしていることがわかります。
質問は:
Coroutine == GoTo
または
Coroutine != GoTo?
なんで?
ゴルーチンは 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
されていますが、この強力なメカニズムを使いすぎると、混乱を招くコードを作成する可能性があります。それでは、すべての強力なプログラミング言語機能がそうではないということですか? ;-)