Go focuses on being readable, maintainable, portable, safe, and fast. It's really hard to deviate from the "expected" way to write Go, and that's the wole point. There are no affordances for clever abstractions and tricks in Go, and the payoff is the code is (usually) instantly familiar, has predictable overhead, and is relatively performant. I've done production work with just about every language that exists and I've seen some borderline unreadable C#, C++ and Java. That said, there 2 things I reproach Go, 1) that they elected to go with a GC instead of reference counting, and 2) the Java-like forced directory layout. Ignoring those "chpices" the compiler is top notch, the tooling arguably the best out there, the test env is a stroke of genius, and the language is dead simple. People who dislike Go tend to be the same whose code is unintelligible to to anyone but themselves since they have some "Einstein level" insight into how to meld inheritance and abstractions to completely obfuscate a code base. If it wasn't for the GC drawback, I'd be huge proponent of Go. I know you can disable the "auto" GC, but you still have to run it manually which is the definition of non-deterministic when dealing with multi-threaded apps.