2009-11-11 29 views
9

Zawsze czytałem o okropnej rzeczy, którą jest "goto". Ale dzisiaj, czytając o języku programowania Google Go, widzę, że wspiera on Coroutines (Goroutines).Różnice między Coroutines i `goto`?

Pytanie brzmi:

Coroutine == GoTo 

Albo

Coroutine != GoTo? 

Dlaczego?

+2

Przekonasz się również, że Goroutine! = Coroutine. Goroutine jest bardziej jak wątek z naprawdę prostym tworzeniem i zarządzaniem. http://golang.org/doc/effective_go.html#goroutines –

Odpowiedz

17

Goroutines to nie to samo co goto - działają równolegle z kodem głównym. Kiedy stwierdzić coś podobnego (od ich przykładem na http://golang.org/doc/effective_go.html)

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

kod Mainline kontynuuje - nie czekaj do sortowania, aby zakończyć. Procedura sortowania uruchamia się na własnym wątku lekkim i po zakończeniu sortowania wątku.

Funkcja goto spowodowałaby rozgałęzienie kodu głównego do oddzielnej ścieżki wykonywania - więc instrukcje po goto nigdy nie zostaną uruchomione.

8

Podstawową różnicą jest to, że instrukcje w językach, które je obsługują, umożliwiają przeskakiwanie do dowolnej lokalizacji w programie z niewielkim lub żadnym ograniczeniem. Podczas gdy korundy mogą na powierzchni wyglądać podobnie, są bardzo różne.

Coroutines umożliwiają zawieszanie procedur (z całym ich kontekstem) i wznawianie ich w lokalizacjach określonych. Tak więc, podczas gdy coroutiny przerywają i przechodzą do innych procedur, zanim zakończą, a następnie wznowią później, punkty, z których procedury wychodzą i są wznawiane, są znane z wyprzedzeniem.

Nie można po prostu przeskoczyć do dowolnej linii w procedurze, procedura ta musi czekać na wznowienie w określonej lokalizacji. Chociaż to przejście kontroli jest o wiele bardziej zorganizowane niż w przypadku goto, możliwe jest napisanie mylącego kodu przez nadużywanie tego potężnego mechanizmu. Czy nie jest tak w przypadku każdej potężnej funkcji języka programowania? ;-)