Just Use Go
Overall sentiment on Go
- Many see Go as a solid, “boring” default for backends, CLIs, and devops tools: simple, fast to compile, and good enough at many tasks.
- Others find it dull or actively unpleasant to write, especially in large codebases, and say it becomes hard to maintain at scale.
- Several participants note that language choice rarely matters for typical CRUD apps; many mainstream languages are “good enough.”
Language design and ergonomics
- Praised for simplicity and a small core language that’s easy to keep in one’s head.
- Criticized for:
- Lack of enums and sum types / algebraic data types.
- Odd export-by-capitalization convention.
- Mediocre module/package system and GOPATH history.
- Limited metaprogramming; generics added late and seen by some as the “wrong” priority vs enums.
Error and null handling debates
- The explicit
if err != nilstyle is a major flashpoint:- Supporters say explicit errors-as-values aid static analysis, avoid hidden control flow, and match modern “no hidden exceptions” guidelines.
- Critics say it creates noisy boilerplate, encourages copy‑paste handling, and doesn’t truly “force” correct handling; errors can still be ignored.
- Nil/null handling is widely disliked:
- Zero values can mask missing data.
- Pointer-based nullability feels awkward.
- Interface/nil semantics are surprising and can break logical expectations.
Ecosystem, tooling, and deployment
- Strong points: fast compilation, good cross‑compilation, static-ish binaries, long-lived services that “just run,” good standard library for networking and backends.
- Weak points:
- Weaker story for full-stack web (asset pipelines, rich ORMs, migrations) compared to frameworks like Django or .NET’s EFCore.
- Complaints about ecosystem maturity, old-OS support, and CVE handling for fat static binaries.
- WebAssembly support described as poor.
Comparisons with other languages
- Java / Kotlin / .NET:
- Some argue Java/.NET are equally or more “boring” and productive, with stronger ecosystems and better error or type systems.
- Others prefer Go over Java’s historical complexity and .NET’s heavier tooling and “bloat.”
- Rust:
- Frequently cited as safer, faster, with better error handling (
Result/?) and richer types. - Many say LLMs reduce Rust’s boilerplate cost, eroding Go’s simplicity advantage; but Rust’s dependency bloat and review difficulty are concerns.
- Frequently cited as safer, faster, with better error handling (
- Python / Node / TS:
- Go often preferred over these for backends due to performance and deployment simplicity, but Python dominates AI/data science and has better CUDA/C ecosystem integration.
- Node/TS still attractive where shared frontend/backend language or rich JS tooling matters.
Concurrency and performance
- Goroutines and channels are widely liked; easy to use multiple cores and hit high request rates.
- Others note race conditions and shared-state bugs are still easy to write; Go doesn’t magically solve concurrency design.
AI, agentic coding, and Go
- Multiple comments say LLMs write Go code very well: the language’s simplicity and consistent patterns work in agents’ favor.
- Some now pick Go primarily because AI tools handle it reliably, even for sizable projects.
- Others argue agents handle Rust and TypeScript well too, weakening Go’s relative advantage.
Critiques of the article’s framing
- Several push back on “just use Go” as overly narrow and dismissive:
- Emphasize choosing the language that fits domain requirements, team skills, ecosystem, and tooling.
- Note that not all work is web backends; systems, games, embedded, and formally verified code often need different choices.
- Some see the post (and similar rants) as flamebait or possibly AI-generated, and call for evaluating content on substance rather than hype.