2009-11-11 5 views
9

Ich lese immer über die schreckliche Sache, die "goto" ist. Aber heute, ich lese über die Google-Programmiersprache Go, sehe ich, dass es Coroutinen (Goroutines) unterstützt.Unterschiede zwischen Coroutines und `goto`?

Die Frage ist:

Coroutine == GoTo 

Oder

Coroutine != GoTo? 

Warum?

+2

Sie finden auch, dass Goroutine! = Coroutine. Eine Goroutine ist eher ein Thread mit wirklich einfacher Erstellung und Verwaltung. http://golang.org/doc/effective_go.html#goroutines –

Antwort

17

Goroutines sind nicht dasselbe wie ein Goto - sie laufen parallel zum Hauptcode. Wenn Sie so etwas wie (aus ihrem Beispiel bei http://golang.org/doc/effective_go.html) angeben

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

der Ferncode weiter auf - es wartet nicht auf die Art zu beenden. Die Sortierroutine startet mit einem eigenen Lightweight-Ausführungsstrang und beendet die Sortierung, die der Thread beendet.

Ein Goto würde dazu führen, dass der Hauptcode zu einem separaten Ausführungspfad verzweigt - so würden die Anweisungen nach dem goto niemals ausgeführt werden.

8

Der Hauptunterschied besteht darin, dass goto Anweisungen in Sprachen, die sie unterstützen, das Springen zu jedem Speicherort im Programm mit wenig oder keiner Einschränkung ermöglichen. Während Korotinen auf der Oberfläche ähnlich erscheinen mögen, sind sie sehr unterschiedlich.

Coroutinen ermöglichen das Aussetzen von Prozeduren (mit ihrem gesamten Kontext) und werden unter bestimmten Standorten fortgesetzt. Also, während Korotinen anhalten und yield Kontrolle auf andere Verfahren, bevor sie abschließen und dann später wieder aufnehmen, ist die Punkte, bei denen die Verfahren liefern und fortsetzen von im Voraus bekannt.

Es ist nicht möglich, einfach zu einer beliebigen Zeile in einer Prozedur zu springen, die betreffende Prozedur muss darauf warten, an einer bestimmten Stelle wieder aufgenommen zu werden. Während diese Kontrollübergabe viel strukturierter als mit goto ist, ist es möglich, verwirrenden Code zu schreiben, indem dieser mächtige Mechanismus überbeansprucht wird. Aber ist das nicht bei jeder leistungsfähigen Programmiersprache der Fall? ;-)