Differenze tra coroutine e `goto`?
Domanda
ho sempre letto circa la cosa orribile che "goto" è. Ma oggi, leggendo il rel="nofollow di programmazione di Google lingua Vai , vedo che suports coroutine (Goroutines).
La domanda è:
Coroutine == GoTo
o
Coroutine != GoTo?
Perché?
Soluzione
Goroutines non sono la stessa di un goto - corrono 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 avvia nel proprio thread leggera di esecuzione e quando finisce il tipo che esce filetto.
Un goto causerebbe il codice di linea principale al ramo ad un percorso di esecuzione separato -. Così le dichiarazioni del dopo goto
sarebbe mai run
Altri suggerimenti
La differenza chiave è che le dichiarazioni goto
nelle lingue che sostengono li permettono di saltare in qualsiasi posizione nel programma con poca o nessuna restrizione. Mentre coroutine maggio sulla superficie sembrano simili sono molto diversi.
coroutine consentano procedure sospesi (con tutto il loro contesto) e ripresa alle alcuni località. Così, mentre coroutine fare Mettere in pausa e controllo yield
ad altre procedure prima di completare e poi riprendere in seguito, i punti in cui le procedure di resa e riprendere da è conosciuto prima del tempo.
Non è possibile saltare semplicemente una linea arbitraria in una procedura, il procedimento in questione deve in attesa di essere ripreso in una posizione specifica. Mentre questo passaggio di controllo è molto più strutturato che con goto
è possibile scrivere codice confuso da un uso eccessivo di questo potente meccanismo. Poi ancora una volta che è che non è il caso di ogni potente funzione di linguaggio di programmazione? ; -)