Skip to content
Tech News
← Back to articles

Migrating from Go to Rust

read original get Rust Programming Book → more articles
Why This Matters

Migrating from Go to Rust in backend development offers significant benefits in correctness guarantees and developer ergonomics, despite the inherent migration costs. While Go remains dominant in many backend contexts due to its simplicity and ecosystem, Rust provides stronger safety features and more precise control, making it a compelling choice for teams seeking reliability and performance. This transition is particularly relevant as Rust's ecosystem continues to grow and mature in backend applications.

Key Takeaways

Out of all the migrations I help teams with, Go to Rust is a bit of an outlier. It’s not a question of “is Rust faster?” or “does Rust have types?”, Go already gets you most of the way there. The discussion is mostly about correctness guarantees, runtime tradeoffs, and developer ergonomics.

A quick disclaimer before we start: this guide is heavily backend-focused. Backend services are where Go is strongest, small static binaries, a standard library focused on networking, and an ecosystem of libraries for HTTP servers, gRPC, databases, etc.

That’s also where most teams considering Rust are coming from (at least the ones who reach out to me), so I think that’s the comparison that’s actually useful in practice. If you’re writing CLI tools, embedded firmware, or game engines, some of this still applies, but to be honest, I’m afraid this is not the best resource for you.

For context, I’ve written about Go and Rust before: “Go vs Rust? Choose Go.” back in 2017, and later the “Rust vs Go: A Hands-On Comparison” with the Shuttle team, which walks through a small backend service in both languages.

What you will learn in this article Where Go and Rust overlap, and where they diverge.

How Go patterns map to Rust.

What you gain from the borrow checker.

Where I tell people to keep Go and where Rust is worth the migration cost.

How to migrate Go services incrementally.

I’ll be upfront: I’m not a fan of Go. I think it’s a badly designed language, even if a very successful one. It confuses easiness with simplicity, and several of its core design tradeoffs ( nil everywhere, error handling as a discipline rule rather than a type, the long absence of generics) point in a direction I disagree with. That said, success matters! Go has captured a real and persistent share of working developers, hovering around 17–19% in the JetBrains Developer Ecosystem Survey. Rust is growing steadily but is still a smaller slice:

... continue reading