* Poor modeling ability (lack of default interface methods, no records, pattern matching, exhaustiveness checks, etc.).
* Error handling is error prone. * Generics are half baked.
* No short hand syntax for passing functions as lambdas.
* No annotations.
* Implicit interfaces make it hard to navigate large code bases because it is very easy to accidentally implement another interface. There are better solutions for the problem they tried to address with structural interfaces. * No string templates.
* The GC not being tunable does not obviate the use cases where it needs to be. Furthermore, Java's ZGC only has a couple of knobs anyway, while giving you the option to use a more tunable GC when your use case calls for it. golang's GC is only tuned for latency at the expense of throughput.
* goroutines are half baked, see Java's virtual threads + structured concurrency for a more manageable approach.
* Observability way superior on the JVM.
* No proper enums.
* No const/final variable declarations.
* Visibility rule are crude. Only public or package private.
* Probably more things I didn't think of at this time.
with open(..) as f:For small functions where you can see everything in a single page, this is fine. Though I think they should always be avoided except the most common cases (`i` for index) because keeping a codebase grep-able is a high priority. Using constant, verbose variable names can make tracing through a codebase much easier.
I'm just as fast/productive in Go (8 years of experience) as I am in Python (13 years of experience), but the resulting code is:
* more maintainable (enforced typing vs typehints+mypy)
* faster (compiled vs interpreted)
* consistently structured / opinionated (until recently we didn't have generics, which meant that engineers often had to do things the "boring and verbose way" instead of the "clever and concise way" which, though frustrating short-term, has proven to be much better for maintainability long-term.
There's no reason that your company can't support multiple languages. Uber has large Go monorepos, Java monorepos, Python monorepos, etc. and they all work in harmony and with different requirements.It's an appeal to (pretend) authority by people who won't or can't make a real argument.
The biggest cause of bugs in Go I find is the weak type system. Nulls, untyped (and overly verbose) errors and the lack of sum types are a big problem.
The rest is not very interesting or particularly complex.
I don’t particularly like Go or Java.
I don’t see what salad has to do with anything I said. Go does have exceptions and unlike Java, they are untyped and rarely used. They’re not great in either language.
I apreciate what Go offers as a better C alternative, similar to Limbo's role in Inferno, and that is the only thing I will advocate Go for.