I do agree with some engineering tradeoffs made in Go. I also like the language a lot!
But there are times I miss things. For instance:
* Dynamically typed code
* Pattern matching
* Protocols (these are awesome! Although you can say that Go’s interface types kinda are protocols, with the exception you can’t implement them on basic types.)
I was looking into Elixir (http://elixir-lang.org) and, it has all these features, and some more:
* Immutable data!
* The actor model for concurrency (I think it’s better, but YMMV)
* The |> operator (which is not built into the language!), which is insanely awesome and improves readability quite a bit.
* The Erlang VM is in itself quite a feature. Support for massive concurrency. You can spin a couple thousands goroutines with no problem, but you can spin millions of Elixir processes and not even flinch at the machine resources. Whatsapp does this.
* Developing microservices in Elixir is a breeze. In fact, you could call them nanoservices, and transition from a microservice architecture to a monolithic one is trivial.
* Code generation in terms of AST modifications, via hygienic macros.
Elixir gives you choice. Pattern matching makes flow of control explicit. Code generation reduces boilerplate and need for Generics.
Plus, all of this packed into the robust, rock-solid Erlang VM.
That being said, Go still has it’s place in my heart. But Elixir is really awesome as well!