En la práctica, hay muy poca diferencia: ambos representan unidades de ejecución separadas cuya interfaz principal con el mundo exterior es a través de mensajes.
Las diferencias están en los detalles de implementación de los idiomas. Aquí hay algunos detalles:
- Los canales en Go están escritos; Si desea enviar mensajes con datos diferentes, necesita canales separados. Con Erlang, uno
receive
recibe todo lo que se envía al proceso y debe coincidir con el patrón (en Go, usaría un select
con múltiples casos, por lo que el código se vería muy similar, solo con diferentes canales).
- Cualquiera puede leer o escribir un canal Go. En Erlang, cualquiera puede enviar a un proceso, pero solo ese proceso recibirá. Esto se vuelve importante si desea dividir una tarea entre varios trabajadores: en Erlang necesita crear un proceso de distribución, mientras que Go simplemente puede compartir un canal.
- Erlang proporciona una ruta (en su mayoría) transparente para distribuir procesos en múltiples hosts / VM. Las goroutinas se limitan a un solo proceso (aunque hay bibliotecas para distribución).
- El manejo de errores es muy diferente. Erlang trata cada proceso como independiente: un error en un proceso (por ejemplo, dividir por 0) no afectará a ningún otro proceso a menos que los vincules explícitamente (aunque algo esperando un mensaje del proceso inactivo se bloqueará). Las goroutinas se ejecutan todas en el mismo espacio de proceso; un divide por 0 eliminará todo el programa.
- En Erlang, los datos son inmutables. Esto significa que toda comunicación entre un proceso y el mundo exterior se realiza a través de mensajes. Go te permite compartir el estado entre goroutines (aunque no deberías).
Este último punto es, creo, el más importante. Si bien ambos usan los mensajes como el medio principal de comunicación, Erlang ofrece garantías mucho más fuertes sobre cómo y cuándo puede cambiar el estado.