But if you are used to generic programming and you think in terms of it, type handling in Go and might think it is a step backwards and Java might be close to what you'd want.
Even better, I think as C++, Rust is starting to look interesting. I am waiting for them stabilize it more (maybe get to beta 1.0 status), because I think it has some very cool things going for it.
So I'm not sure I agree on your first two points. For me, lack of exceptions and generics means Go code is at least as verbose as Java, if not more so. Multi-threadedness is a wash for me; channels vs fork-join and executors are just not that different.
I think Java can produce native code today, but it isn't worth it for most scenarios where you would actually use Java. I think we'll see that change if Oracle ships an AOT compiler in "official Java".
http://cr.openjdk.java.net/~jrose/pres/201502-JVMChallenges....
Slide 12.
I do not use exceptions in C++ so that was not a big change for me. Our code needs to be relatively deterministic (even though we are not hard real-time yet) and exceptions hamper with that goal.
I incorrectly used the word "multi-threadedness". Concurrency in go is very straightforward. Channels are extremely lightweight and are different from forking (which creates a new process with its own address-space).
Available in Aonix, IBM J9, Jamaica JVM, Excelsior JET
Just because OpenJDK doesn't offer it, doesn't mean others don't.