In pratica, c'è poca differenza: entrambi rappresentano unità di esecuzione separate la cui interfaccia primaria con il mondo esterno è tramite messaggi.
Le differenze sono nei dettagli di implementazione delle lingue. Ecco alcuni dettagli del genere:
- I canali in Go sono stati digitati; se vuoi inviare messaggi con dati diversi, hai bisogno di canali separati. Con Erlang, un
receive
ottiene tutto ciò che viene inviato al processo e deve corrispondere a pattern (in Vai, dovresti usare select
con più casi, quindi il codice sarebbe molto simile, solo con canali diversi).
- Chiunque può leggere o scrivere un canale Go. In Erlang, chiunque può inviare a un processo, ma solo quel processo riceverà. Questo diventa importante se si desidera dividere un'attività tra più worker: in Erlang è necessario creare un processo di distribuzione, mentre Go può semplicemente condividere un canale.
- Erlang fornisce un percorso (principalmente) trasparente per la distribuzione dei processi su più host / VM. Le goroutine sono confinate in un singolo processo (sebbene ci siano librerie per la distribuzione).
- La gestione degli errori è molto diversa. Erlang considera ogni processo come indipendente: un errore in un processo (ad esempio divide per 0) non influirà su nessun altro processo a meno che non li colleghi esplicitamente (anche se qualcosa in attesa di un messaggio dal processo morto si bloccherà). Le goroutine scorrono tutte nello stesso spazio del processo; una divisione per 0 eliminerà l'intero programma.
- In Erlang, i dati sono immutabili. Ciò significa che la tutta comunicazione tra un processo e il mondo esterno avviene attraverso i messaggi. Go ti consente di condividere lo stato tra le goroutine (anche se non dovresti).
Questo ultimo punto è, penso, il più importante. Mentre entrambi usano i messaggi come mezzo di comunicazione primario , Erlang offre garanzie molto più forti su come e quando lo stato può cambiare.