Thanks for your post.
It’s definitely better than C, Java and Python, but I’m not sure of JavaScript. Because, ES6 Async/Wait is easy to mentalize for me. It looks sequential but async in nature.
In others, Actor models for concurrency are also easy to mentalize, however, then again, hard to get benefit without some good experience.
I believe some strong features of Go are: its unique blend of dynamic type safety, kind of: duck typing with interfaces. And, composition without inheritance. I find these are very powerful features.
Goroutines alone are OK but the communication mechanism between them through channels have some pitfalls.
First of all, they seem easy to learn and use, but, there are some pitfalls like:
- fixed sized async buffers
- panics on closed channels
- inconsistent behaviour between buffered and unbuffered channels
- sending to a nil channel causes it to block
- using mutexes inside channels (sometimes necessary evil) causes panics (on me!), etc.
I think without `select` statement, channels would be ruined. I’m waiting for Go 2.0 to improve channels then the status quo.