I'd love to hear from somebody who reluctantly tried Go despite initially caring about this stuff, and was won over.
I still care about stuff like this, and there are definitely ergonomic improvements that could be made.
I guess my feeling is that overall, for the programs I write (network services, broadly speaking), the benefits greatly outweigh the annoyances.
on the positive site, in my experience, Go:
- Is easy to learn
- Has a relatively small surface area
- Generates static binaries
- Forces you to consider error handling
- (I'm listing this as a benefit as well as it's a downside!)
- Is pretty darn fast, both at build time and run time
- Is mostly well documented (text/template documentation excluded)
- Takes backwards compatibility seriously
- Cross compiles easily
- Has generally very good and fast tooling
- Has superb network-related libraries
- Has excellent support for concurrency
on the negative side, it: - Is often not pretty or elegant
- It does have an aesthetic of its own once you're used to it, but it's never as satisfying as nailing something exactly right in haskell or rust, or doing something highly dynamic and fancy in python or ruby
- Sometimes resists nice algorithms and data structures
- this is why I would never want to use it for data science, for example
- Is very opinionated
- if you want something it doesn't agree with, you just don't get that thing
For much of the work I do, the positives outweigh the negatives. Maybe that helps?If you use the result. Its easy to overlook that some more procedural functions might return only an optional err value.
See also stuff like append sometimes mutates and returns a reference to a slice with the same backing array, and sometimes returns a slice with a different backing array. Nothing going to remind you you forgot to copy before returning.