Trong thực tế, có rất ít sự khác biệt: cả hai đều đại diện cho các đơn vị thực hiện riêng biệt có giao diện chính với thế giới bên ngoài thông qua các tin nhắn.
Sự khác biệt là trong các chi tiết thực hiện của các ngôn ngữ. Dưới đây là một vài chi tiết như vậy:
- Các kênh trong Go được gõ; nếu bạn muốn gửi tin nhắn với dữ liệu khác nhau, bạn cần các kênh riêng biệt. Với Erlang, người ta
receive
nhận được mọi thứ được gửi đến quy trình và phải khớp mẫu (trong Go, bạn sẽ sử dụng a select
với nhiều trường hợp, do đó mã sẽ trông rất giống nhau, chỉ với các kênh khác nhau).
- Bất cứ ai cũng có thể đọc hoặc viết một kênh Go. Trong Erlang, bất kỳ ai cũng có thể gửi tới một quy trình, nhưng chỉ quy trình đó mới nhận được. Điều này trở nên quan trọng nếu bạn muốn phân chia một nhiệm vụ giữa nhiều công nhân: trong Erlang bạn cần tạo quy trình phân phối, trong khi Go có thể chỉ cần chia sẻ một kênh.
- Erlang cung cấp một đường dẫn trong suốt (hầu hết) để phân phối các quy trình trên nhiều máy chủ / VM. Goroutines bị giới hạn trong một quy trình duy nhất (mặc dù có các thư viện để phân phối).
- Xử lý lỗi rất khác nhau. Erlang coi mỗi quy trình là độc lập: một lỗi trong một quy trình (giả sử chia cho 0) sẽ không ảnh hưởng đến bất kỳ quy trình nào khác trừ khi bạn liên kết rõ ràng với chúng (mặc dù điều gì đó đang chờ thông báo từ quy trình chết sẽ bị treo). Goroutines tất cả chạy trong cùng một không gian quá trình; một số chia cho 0 sẽ lấy toàn bộ chương trình.
- Trong Erlang, dữ liệu là bất biến. Điều này có nghĩa là tất cả giao tiếp giữa một quá trình và thế giới bên ngoài diễn ra thông qua các tin nhắn. Go cho phép bạn chia sẻ trạng thái giữa các con khỉ đột (mặc dù bạn không nên).
Điểm cuối cùng này, tôi nghĩ là quan trọng nhất. Trong khi cả hai thông điệp sử dụng như là chính phương tiện truyền thông, Erlang làm cho đảm bảo mạnh hơn nhiều về cách thức và thời nhà nước có thể thay đổi.