2009-11-11 24 views
9

Ho sempre letto della cosa orribile che "goto" è. Ma oggi, leggendo il linguaggio di programmazione di Google Go, vedo che si basa su Coroutine (Goroutine).Differenze tra Coroutine e `goto`?

La domanda è:

Coroutine == GoTo 

O

Coroutine != GoTo? 

Perché?

+2

Scoprirai anche che Goroutine! = Coroutine. Una Goroutine è più simile a un thread con creazione e gestione davvero semplici. http://golang.org/doc/effective_go.html#goroutines –

risposta

17

Le goroutine non sono le stesse di un goto - vengono eseguite in parallelo con il codice principale. Quando si affermi una cosa del genere (dal loro esempio a http://golang.org/doc/effective_go.html)

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

il codice mainline continua - non aspetta per l'ordinamento per terminare. La routine di ordinamento si avvia sul proprio thread di esecuzione leggero e quando termina l'ordinamento che il thread esce.

Un goto causerebbe il diramazione del codice mainline su un percorso di esecuzione separato, pertanto le istruzioni successive allo goto non verrebbero mai eseguite.

8

La differenza principale è che le istruzioni goto nelle lingue che li supportano consentono di saltare a qualsiasi posizione nel programma con restrizioni minime o inesistenti. Mentre le coroutine sulla superficie sembrano simili, sono molto diverse.

Le coroutine consentono di sospendere le procedure (con tutto il loro contesto) e di riprendere a determinate posizioni. Pertanto, mentre le coroutine fanno una pausa e il controllo yield in altre procedure prima che vengano completate e quindi riprese in un secondo momento, i punti da cui le procedure producono e riprendono sono noti in anticipo.

Non è possibile saltare semplicemente a una linea arbitraria in una procedura, la procedura in questione deve attendere di essere ripresa in una posizione specifica. Mentre questo passaggio di controllo è molto più strutturato rispetto a goto, è possibile scrivere codice confuso sfruttando questo potente meccanismo. Quindi, di nuovo, non è il caso di tutte le potenti funzionalità del linguaggio di programmazione? ;-)