Will Ginsberg | freelance web developer

Don't ditch NodeJS for Golang

May 11, 2026

After reading Just fucking use Go I have thoughts.

Here's some arguments that I don't agree with:

  1. Go is good because you can avoid using Docker

    One reason we use Docker is to ensure that external binaries are available at runtime. This can include things like curl, ffmpeg, imagemagick, pdf converters, etc. Having the right combination of these installed, with the correct version, is a problem you'll face whether you're running a NodeJS process a Go binary.

  2. Go is good because it makes formatting easy

    Fair point, life would be easier without having to configure your formatter and linter. Though the whole point of configuring a formatter is that you don't commit a bunch of white space changes all the time. Whether you deal with gofmt, prettier, or anything else, developers can format their code before they commit it, and the CI pipeline can enforce it.

  3. No lockfile drift between dev and CI

    This is not a problem I run into. The CI pipeline does a npm ci. Notably this ensures that:

    If dependencies in the package lock do not match those in package.json, npm ci will exit with an error, instead of updating the package lock.
  4. Deployment is a copy command

    This does sound attractive. Although, for even moderately complex projects, we're often going to build a Docker image anyway (see above). And if we already did that work, we can take advantage of something like ECS, Cloud Run, etc. and get healthchecks, rollbacks, blue/green deployments, managed environment variables, etc. for free.

  5. Error handling is better in Go

    Your try/catch nesting hellscape doesn't make errors disappear, it just hides them until production at 2am.

    The best error handling is not explicitly handling errors. That's true in any language. With a framework like NestJS, for example, unhandled errors in processing a request will result in an automatic HTTP 500. When using Prisma, a missing database record can automatically trigger an HTTP 404. No try/catch needed.

  6. Create a whole dynamic page in a few lines of code

    Database, templates, and an HTTP handler in one screen

    Looks a lot like React Router (v7). Or TanStack Start. Or plain Express with EJS templates.

    The ORMs, dependency injection, service layers, and controllers/ directory are never strictly needed; at some point they can be useful in managing complexity which does tend to emerge.


In conclusion: more power to anyone using Golang. For the time being I'm going to keep developing backends with NodeJS, and I'm happy to keep just one language in my head at once.