Easy concurrency.
Good tooling.
A handy standard library.
Static compiles.
The hype of a "Google language".
You don't need "low conceptual barrier" or anything particularly beautiful about its design to explain its success.
Those are the reasons I use it too.
Good tooling in particular is available because Go syntax is deliberately simple. It's simple for humans and simple for tools.
Go shipped with Go parser in standard library from day 1. Go syntax hasn't changed from that day.
Having Go parser in standard library means that building tools like go get, linters, auto-formatters, code coverage tools etc. is very simple.
Contrast that with C++ or Rust or Swift.
A C++ parser alone (clang) is probably a bigger project than the whole Go compiler. Rust and Swift don't even have a stable syntax yet and as far as I know they don't have the equivalent of Go's ast package.
If Go didn't aggressively tame complexity then it would have ended the same way as Rust or Swift. Sure, it would have generics, but also slow compilation time, language that takes years to reach stability, tooling that is exponentially more difficult to write etc.
That's engineering: making decision about what is more important and accepting that less important things have to be dropped.
If features are most important, then you accept complexity. See Rust or Swift.
If simplicity is most important, then you accept less features. See Go.
I for one am glad that I have a choice.
I would rather have Go than a third language driven by the same ideas and priorities as Rust or Swift.
https://crates.io/crates/syn is the most popular parser crate at the moment.
Only Google never made a good job at promoting it, and it's a dynamic language meant as a better-JS, so not the same market as Go.
>Rust does have all features you listed and of course generics. Both started around 2009 so it is about same age as Go but not as popular among developers.
Rust took until 2-3 years ago to finalize its design and be stable. Go was already stable for years by that point.
And Rust comes with an uncommon, and hard to grasp at first, memory management model which stops many in their tracks -- it's not the presence of generics (or traits, or option types or whatever) that's the issue.
Additionally Dart was betrayed by Google's own teams that decided to invest in TypeScript instead.
They didn't hit 1.0 (and the corresponding backwards compatibility guarantees) at the same time.
So there's always that.
Ditto for C#, but of course C# was pushed by MS as the native solution for Windows, a platform that already had 95% market share.
So asking Go to be popular as Java in 10 years is to live up to expectation that past languages weren't asked.
Go actually just pushes all the complexity into the code you write with it, so I don't buy that that is the reason.