Language wars are exhausting. They also miss the point. The honest question isn't 'Go or Python'—it's 'Go or Python, for this service, at this stage, with this team.' Here's how we answer it.
Where Go earns its keep
Anything with concurrency at its heart. API gateways. Webhook processors. Long-poll endpoints. The compiled binary, the GC tuned for low pause times, goroutines so cheap you can hold ten thousand of them—it all adds up to predictable latency under load.
Memory footprint matters too. A Go service handling 5,000 RPS often fits in 256MB. The equivalent Python service won't, and you'll be paying for the difference every month.
Where Python still wins
Anywhere the work is library-bound rather than CPU-bound. Data pipelines that lean on pandas. Anything touching ML or LLMs—Hugging Face, LangChain, the entire scientific stack lives here. Admin tooling and internal scripts where iteration speed beats runtime speed.
Hiring is another quiet advantage. Senior Python engineers are easier to find than senior Go engineers, especially in India. The labor market for Go is real but small.
A practical split
In a typical SaaS we build, the lines fall like this:
- Customer-facing API gateway: Go.
- Auth, billing, webhook fanout: Go.
- Background workers, ETL, reporting: Python.
- Internal admin tools, scripts, integrations: Python.
- ML/inference services: Python.
What we'd avoid
Don't rewrite Python in Go to chase performance. Almost always the latency win lives in the database query, not the language. Profile first. Most 'slow Python' is slow ORM.
Don't pick Go because it 'looks more serious.' If your team can't read it fluently in six months, it's the wrong choice for them, even if it's the right choice in theory.
Operational realities
Go deploys as a single binary. Containers are tiny (~15MB on Alpine). Cold starts on Lambda are sub-100ms. Memory is predictable.
Python deploys as a runtime + dependencies. Containers are larger (~80–200MB). Lambda cold starts run 200ms–2s depending on imports. Memory grows in surprising ways under load. None of this is fatal—you just account for it.