I’ve built large-scale systems in both Go and Elixir. The Go one supported at least 100k concurrent TCP connections from IOT devices. The Elixir services ingest events from a monolithic Rails application faster than the Rails application can produce them.
So I feel qualified to comment here.
Points for Go
I agree with @wmnnd regarding the Go binary. That’s certainly a “killer feature”. And that I can cross-compile on my Mac for other OSes too is super nice. Being able to take a binary to any other operating system and just run my program without any external dependencies is one of the best experiences I’ve had with a programming language.
Another Go feature that I appreciate is the type definitions in structs, functions and so on. It helps me not make as many mistakes. The compiler tells me what I’m doing wrong and then I fix it. But sometimes the errors from those can be quite… cryptic.
I would also list go fmt
as a plus here, but Elixir is certainly catching up in those stakes.
Points for Elixir
What I prefer in Elixir is that the tooling seems to be better thought-out. Elixir has a fantastic package manager, whereas Go has… well, I’m not sure what they have. It seems like a bit of a “wild west” over in Go-land in that regard.
Elixir’s process management / supervision was also easier for me to wrap my head around than Go’s channels. It somehow makes more sense in ways that I can’t explain right now. When Go’s channels crashed I would get more cryptic messages from that. Elixir’s supervisors and the underlying Erlang error messages typically show me why a process exited, which is very helpful for debugging reasons.
Elixir as a language also tends to have quite a few helpful things built into the standard library, where in Go there seems to be some opposition to having common things like slicing arrays built in. (Although googling this last part turns up nothing of the sort… so maybe my memory is wrong?)