2009-11-11 9 views
9

나는 항상 "goto"라는 끔찍한 일에 대해 읽었습니다. 그러나 오늘, Google 프로그래밍 언어 Go에 대해 읽었을 때, 나는 그것이 Coroutines (Goroutines)를지지한다는 것을 알았습니다.Coroutine과`goto`의 차이점은 무엇입니까?

질문은 :

Coroutine == GoTo 

또는

Coroutine != GoTo? 

?

+2

Goroutine! = Coroutine도 있습니다. Goroutine은 정말 단순한 생성 및 관리 기능을 가진 스레드와 같습니다. http://golang.org/doc/effective_go.html#goroutines –

답변

17

Goroutines는 goto와 동일하지 않습니다. 주 코드와 병렬로 실행됩니다. 정렬 완료하는 것이 기다리지 않는다 - 당신이 (http://golang.org/doc/effective_go.html에서 자신의 예에서) 뭔가를

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

명시하면 메인 라인 코드에 계속됩니다. 정렬 루틴은 자체 경량 스레드 실행 및 스레드가 종료하는 정렬을 완료 할 때 시작됩니다.

goto를 사용하면 주 코드가 별도의 실행 경로로 분기되므로 goto 이후의 명령문은 실행되지 않습니다.

8

주요 차이점은 해당 언어를 지원하는 언어로 된 goto 문이 제한이 거의 없거나 전혀없는 프로그램의 모든 위치로 점프 할 수 있다는 것입니다. 코 루틴은 표면적으로 비슷하지만 매우 다를 수 있습니다.

코 루틴을 사용하면 절차를 일시 중지하고 (모든 상황을 고려하여) 특정 위치에서 재개 할 수 있습니다. 따라서 coroutine이 일시 중지되고 완료되기 전에 다른 프로 시저에 대한 제어가 수행 된 후 나중에 다시 시작되는 경우 프로 시저가 생성하고 다시 시작하는 시점은 미리 알 수 있습니다.

프로 시저에서 임의의 줄로 간단히 건너 뛰는 것은 불가능합니다. 문제의 프로 시저가 특정 위치에서 다시 시작되기를 기다려야합니다. 이 제어의 전달은 goto보다 훨씬 구조화되어 있지만 강력한 메커니즘을 과도하게 사용하면 혼동스러운 코드를 작성할 수 있습니다. 그렇다면 모든 강력한 프로그래밍 언어 기능의 경우가 아닌가? ;-)

관련 문제