Rust vs Go:2026 年后端选哪个?(附真实项目对比)

0 阅读7分钟

"Rust for high stakes, Go for low costs." —— Bitfield Consulting, 2026

这个问题每年都有人问,每年都有新答案。作为一个用 Go 写了四年生产服务、最近又把核心模块迁移到 Rust 的后端开发者,我想用真实的项目经验给你一个不带滤镜的对比。

不是"哪个更好",而是"什么时候该用哪个"。


先说结论

| 场景 | 推荐 | 理由 | | --- | --- | --- | | 高并发微服务 | Go | goroutine 天生适合,开发快 | | 计算密集型 | Rust | 零成本抽象,无 GC 停顿 | | 创业公司 MVP | Go | 一周上手,三周出活 | | 基础设施/嵌入式 | Rust | 内存安全是刚需 | | 团队 < 5 人 | Go | 招人容易,学习曲线低 | | 性能天花板要压到极致 | Rust | 没有 GC 的上限就是更高 |

下面展开说。


性能:数据说话

2026 年初的 TechEmpower Round 23 基准测试和多个独立评测给了我们很清晰的数据:

HTTP 服务吞吐量

框架              请求/秒 (2核)     内存占用 ───────────────────────────────────────── Rust Actix-web     ~160K req/s      50-80 MB Rust Axum          ~148K req/s      55-85 MB Go Gin             ~95K req/s       100-320 MB Go Fiber           ~105K req/s      95-280 MB 

Rust 在吞吐量上大约领先 Go 1.5-1.7 倍,内存占用低 2-4 倍。

这个差距在你日请求量只有几千的时候可以忽略。但如果你跑的是每秒几万请求的核心链路,Rust 省下来的内存和 CPU 就是实打实的服务器成本。

CPU 密集型任务

在 Fibonacci、JSON 解析、二叉树遍历等 CPU 密集测试中,Rust 通常是 Go 的 2 倍快:

// Rust: 计算 Fibonacci 第 40 项 fn fib(n: u64) -> u64 {     match n {         0 => 0,         1 => 1,         _ => fib(n - 1) + fib(n - 2),     } }  fn main() {     let start = std::time::Instant::now();     let result = fib(40);     println!("fib(40) = {}, 耗时: {:?}", result, start.elapsed());     // ~22ms (AMD EPYC) } 
// Go: 同样的计算 package main  import (     "fmt"     "time" )  func fib(n uint64) uint64 {     if n <= 1 {         return n     }     return fib(n-1) + fib(n-2) }  func main() {     start := time.Now()     result := fib(40)     fmt.Printf("fib(40) = %d, 耗时: %v\n", result, time.Since(start))     // ~39ms (AMD EPYC) } 

77% 的差距。这不是微基准测试的噪音,这是 Rust 零成本抽象 + 无 GC 的真实体现。


并发模型:两种哲学

这是两者最根本的设计差异,也是你选型时最该想清楚的点。

Go:goroutine,简单粗暴

func handleRequest(ctx context.Context, req Request) error {     // 开 3 个并发任务     ch := make(chan Result, 3)      go func() { ch <- queryDB(req.UserID) }()     go func() { ch <- fetchCache(req.Key) }()     go func() { ch <- callAPI(req.Token) }()      // 收集结果     for i := 0; i < 3; i++ {         result := <-ch         process(result)     }     return nil } 

Go 的并发就是这么简单。go 关键字一加,goroutine 跑起来了,channel 收数据。一个新手看半小时文档就能写出能跑的并发代码。

Goroutine 的调度器是 M:N 模型,一个 goroutine 大约 2-8 KB 栈空间,百万级并发在合理配置下完全可行。

Rust:async/await,精确控制

use tokio;  #[tokio::main] async fn handle_request(req: Request) -> Result<(), Error> {     // 并发执行 3 个任务     let (db_result, cache_result, api_result) = tokio::join!(         query_db(&req.user_id),         fetch_cache(&req.key),         call_api(&req.token),     );      process(db_result?);     process(cache_result?);     process(api_result?);     Ok(()) } 

Rust 的 async 也很优雅,但底层完全不同。编译器会把 async 函数编译成状态机,零运行时开销。没有 GC,没有隐式调度,你精确控制每一个字节的生命周期。

代价呢? 借用检查器(borrow checker)会是你前几个月最大的敌人。这段代码看着简单,但一旦涉及生命周期标注和 pin,复杂度会指数级上升。


真实项目踩坑记录

案例 1:消息队列消费者服务

我们有一个从 Kafka 消费消息、处理后写入 PostgreSQL 的服务。

Go 版本(初版):

  • 开发时间:3 天

  • 代码量:~800 行

  • 内存占用:~280 MB

  • P99 延迟:12ms

Rust 版本(重写版):

  • 开发时间:8 天

  • 代码量:~1200 行

  • 内存占用:~65 MB

  • P99 延迟:4ms

Rust 版本内存省了 77%,延迟降了 67%。但开发时间多了将近 3 倍。

我的结论:如果这个服务的流量在日均百万级以下,Go 版本就够了。省下来的 5 天开发时间比省下来的 200MB 内存值钱得多。但我们的量级是日均 5 亿条消息,Rust 版本一年省下来的服务器成本够养一个 Rust 工程师了。

案例 2:内部 API 网关

一个给内部微服务做路由、鉴权、限流的网关。

这次我直接用 Go。原因:

  1. 并发模型简单,goroutine-per-request 天然适合

  2. 团队里 4 个人都会 Go,只有 1 个人会 Rust

  3. 瓶颈在下游服务响应时间,不在网关本身的计算

// Go 的限流器,几行搞定 func RateLimiter(limit int, window time.Duration) gin.HandlerFunc {     limiter := rate.NewLimiter(rate.Every(window/time.Duration(limit)), limit)     return func(c *gin.Context) {         if !limiter.Allow() {             c.AbortWithStatusJSON(429, gin.H{"error": "rate limited"})             return         }         c.Next()     } } 

这种场景你用 Rust 就是杀鸡用牛刀。


编译时间:Rust 的阿喀琉斯之踵

必须提这个痛点。

项目规模         Go 编译时间    Rust 编译时间 ───────────────────────────────────────── 小型 (1K行)       1-2 秒        15-30 秒 中型 (10K行)      3-8 秒        45-120 秒 大型 (50K行)      10-20 秒      3-8 分钟 

Go 的编译速度快到你可以忽略它的存在。Rust 的编译时间……你会学会在等编译的时候刷手机。

好消息是 Rust 团队一直在优化。cargo check 只做类型检查不生成二进制,能快 3-5 倍。sccache 做增量编译缓存。2026 年的 Rust 1.83 对编译速度又做了一轮优化,中型项目已经能控制在 1 分钟以内了。


生态系统:2026 年谁更强?

Go 的优势领域

  • 云原生

    :Kubernetes、Docker、Terraform、Prometheus……CNCF 生态大半是 Go 写的

  • Web 框架

    :Gin、Echo、Fiber,成熟稳定

  • 微服务工具链

    :gRPC、OpenTelemetry、etcd,一等公民

Rust 的优势领域

  • 系统编程

    :Linux 内核已经将 Rust 从实验性升级为永久支持

  • WebAssembly

    :Rust 是 WASM 的最佳拍档

  • 高性能中间件

    :Cloudflare Workers、Deno、Turbopack 都是 Rust

  • 区块链/加密

    :Solana、Polkadot 的核心

2026 年的一个大变化:Debian 从 5 月开始在 APT 包管理器中强制引入 Rust 依赖。Android 16 已经内置了 Rust 编写的内存分配器。Rust 不再是"那个难学的新语言"了,它是基础设施层的标准选择。


招人和薪资

说点现实的。

根据 2026 年的数据:

  • Rust 开发者平均薪资

    :美国 $178,000(同比 +12%)

  • Go 开发者平均薪资

    :美国 $165,000(同比 +8%)

差距在拉大,原因是 Rust 人才供给不足。金融、汽车、航空这些安全敏感行业疯抢 Rust 工程师。

Go 的优势是池子大。会 Go 的人多,培训成本低,一个 Java/C++ 开发者转 Go 可能就一两周的事。转 Rust?做好三到六个月的准备。


我的选型决策树

你的项目核心瓶颈是什么? │ ├── CPU 计算 / 内存限制 / 尾延迟要求严格 │   └── → 选 Rust │ ├── I/O 密集 / 高并发连接 / 快速迭代 │   └── → 选 Go │ ├── 不确定? │   ├── 团队 < 10 人,先出产品 → Go │   ├── 已有 Go 代码库 → 混合:热点模块用 Rust 重写 │   └── 从零开始且性能是核心卖点 → Rust │ └── 还是纠结?     └── → 先用 Go 出 MVP,跑出数据再决定要不要迁 Rust 

最后一句话:Go 让你快速到达 80 分,Rust 帮你冲到 99 分。大多数业务,80 分就够了。


参考资料

  • TechEmpower Round 23 Benchmarks

  • Rust vs Go: 40% Latency Gap in 2026

  • ByteIota: Rust vs Go 2026 Backend Performance

  • Rust in Linux Kernel - Permanent Adoption

  • Bitfield Consulting: Rust vs Go


我是小军,一个喜欢折腾后端架构的独立技术博主。如果这篇文章对你有帮助,欢迎关注我的公众号「技术放肆聊」,每周更新技术干货。