To say that channels is the answer to fixing select() ignores the fact that Go doesn't support non-blocking I/O at all. select{} only works on channels, and I/O operations are always blocking.
It seems like a bit of a missed opportunity to not let file descriptors and other data structures support select{}, much like they decided not to let "range" work for anything except built-ins. To wait on multiple sockets, you have to start a goroutine per socket and communicate via channels, even if all you want to do is service one event at a time. That's fine, it's Go's way. What I'm less happy about is that because of this design, you can't ever interrupt a blocking operation — reads in particular — other than by closing the file descriptor. That's why SetReadDeadline has to exist, to at least let you set a timeout.
[1] https://commandcenter.blogspot.com/2012/06/less-is-exponenti...
There is a role for a language like that, but calling it fixing c++ ignores 90% of the reasons people use c++ in the first place. In fact, id say that go reminds me most of the version of c++ that operated as a preprocessor. It's almost exactly the same template implementation!
Personally, I think Golang is a Java killer. I never write one line Java code since I became familiar with Go. The main reason is it is painful to maintain a Java web project, slow compiling, slow startup, large memory consuming, so many concepts (of all sorts of frameworks) to learn, etc.
Golang doesn't have the library or tooling maturity or breadth to make it a real competitor to Java in the enterprise space IMHO.
Golang lacks a package manager (and "go get" is not a real substitute when it completely shirks semantic versioning). There's no solid IDE with Golang support. Most of the web server and database tools are very low level, and while they provide the necessary features for a smaller project or if you're writing exclusively microservices, they leave a lot be desired if you're writing a run of the mill web app, or an enterprise system for batch processing (orders, transactions, email etc).
For smaller projects, most languages are better than Java for the reasons you mention (including dynamic languages like Python for example). Golang is a novel language and it definitely has a niche, but I find it right inbetween a language like Python and a "heavy" language like C#/Java.
Honestly, there wasn't a solid IDE for Java for a while, and the makers of IntelliJ are working on Gogland.
However, IMHO, the only thing I miss in an IDE for Go is inline debugging (but in truth, I never used IntelliJ's refactoring tools, so I could have missed out on all the benefits of a powerful IDE).
Except for that, VSCode and nvi are all I (personally) need.
They announced it ten days ago.
The point is rather that Go occupies the same niche as Java, and does so arguably better. As such, "Java killer" means new software projects are going to increasingly favor Go over Java.
Seems like there's decent enough tools + emacs/vim wrappers to me. In my mind this is one of the primary merits of go.
Even if this were true (which it isn't—Go uses multiple return values for returning errors), returning a tuple would in no way make analysis harder. Detecting whether a function returns (T, err) for some T is utterly trivial.
Golang supports generic multiple returns (https://gobyexample.com/multiple-return-values). It's just much more commonly used for errors (instead of try catch).
This is why my company is being forced to scrap Go. It was good since it was easy to learn by devs, type checked, and fast. But the lack of libraries vs Java means it won't work for a lot of projects. One big issue is the lack of good database drivers.
Hmmm, I'm using it with WebStorm and the Golang support is pretty decent. Autocompletion, automatic help/function lookup, debugging, etc.
What are you looking for that's missing in a Golang IDE?