after years in the js world and recently diving into go, i have thoughts. not hot takes — just honest observations from someone who's lived in both.
Suprim Khatri
FullStack Developer · March 5, 2025
i didn't realize how spoiled i was until i switched to go.
in js, there's a package for everything:
everything is one npm install away. the dx is incredible. you can go from idea to working api in an afternoon.
then you open a go project.
go doesn't have a better auth. it doesn't have a drizzle. the validation story is struct tags and switch cases, not z.string().email().min(5).
my first reaction: this is a downgrade.
my second reaction, a few days later: wait, i actually understand what's happening now.
when you implement jwt auth yourself in go — generating tokens, setting httponly cookies, writing refresh logic, handling token expiry — you understand auth in a way that using better auth never required. better auth is excellent. but it abstracts so much that you can ship auth without understanding auth.
// you write this yourself in go
token := make([]byte, 32)
rand.Read(token)
verifyToken := hex.EncodeToString(token)
// store in db with expiry, send in email link, verify on clickin js you call auth.sendVerificationEmail() and move on. both work. only one teaches you.
in js i used drizzle. schema definition in typescript, type-safe queries, migrations handled for me. it's genuinely good.
in go, the community leans toward raw sql — either directly or through sqlc, which generates type-safe go code from your sql queries.
i expected to hate this. i don't.
SELECT id, title, completed FROM todos WHERE id = $1there's something clarifying about writing exactly what you want the database to do. no magic, no query builder abstraction layer, no wondering what sql the orm is actually generating. you write sql, you get results.
the tradeoff is real — schema management is more manual, you lose some of the dx that drizzle provides. but you gain a directness that i've started to appreciate.
go is compiled. javascript is interpreted (with jit optimization, yes, but still).
the performance difference is real and measurable. for most crud applications it won't matter. for high-throughput services, it matters a lot. this is why companies like uber, cloudflare, and twitch run go in their critical paths.
the frontend. obviously.
but also:
if you're building a product and need to move fast, js/ts is probably the right call. the ecosystem exists to help you ship.
and the deploy story is beautiful. build your go app, get one binary, ship it anywhere. no node_modules. no runtime dependencies. just a file that runs.
these aren't competing ecosystems — they're complementary ones.
js taught me how to build. go is teaching me why things work the way they do.
if you're comfortable in js and curious about go: the discomfort of the first few weeks is worth it. not because go is better, but because the friction of learning it will make you understand things that years of js never forced you to.