开发者生态
morning
从 Go 迁移到 Rust
2026-05-24
1 阅读
jabits
迁移指南 从 Go 迁移到 Rust 作者:Matthias Endler 发布时间:2026-05-21 在我帮助团队进行的所有迁移中,Go to Rust 有点异常。这不是“Rust 更快吗?”的问题。或者“Rust 有类型吗?”,Go 已经帮你搞定了大部分事情。讨论主要是关于正确性保证、运行时权衡和开发人员人体工程学。在开始之前先声明一下:本指南主要以后端为重点。后端服务是 Go 最强的地方,小型静态二进制文件,专注于网络的标准库,以及 HTTP 服务器、gRPC、数据库等的库生态系统。这也是大多数考虑 Rust 的团队(至少是那些联系我的团队)的来源,所以我认为这是在实践中实际有用的比较。如果您正在编写 CLI 工具、嵌入式固件或游戏引擎,其中一些仍然适用,但说实话,恐怕这不是最适合您的资源。作为上下文,我之前写过关于 Go 和 Rust 的文章:“Go vs Rust?选择 Go。”早在 2017 年,后来与 Shuttle 团队进行了“Rust 与 Go:实际比较”,其中使用两种语言介绍了一个小型后端服务。您将在本文中学到什么 Go 和 Rust 的重叠和分歧之处。 Go 模式如何映射到 Rust。您从借用检查器中获得什么。我告诉人们保留 Go,而 Rust 值得付出迁移成本。如何增量迁移Go服务。我来自哪里 我会坦白说:我不是 Go 的粉丝。我认为这是一种设计糟糕的语言,即使是一种非常成功的语言。它混淆了简单性和简单性,并且它的几个核心设计权衡(到处都是 nil、错误处理作为纪律规则而不是类型、长期缺乏泛型)指向了我不同意的方向。也就是说,成功很重要! Go 已经占据了工作开发人员的真实且持续的份额,在 JetBrains 开发者生态系统调查中徘徊在 17-19% 左右。 Rust 正在稳步增长,但仍然占据较小的份额:Go 显然对很多人有用,而假装不这样做的指南没有帮助。因此,我将尽最大努力在本指南中保持客观,而不是重新纠正旧的论点。但你应该了解我的先验,这样你就可以校准。另一个值得披露的先前事项:我经营一家 Rust 咨询公司;我当然有偏见!更多人使用 Rust 对我的业务有好处。但我也曾用这两种语言进行过专业工作,并将 Go 服务投入生产。本指南适用于希望诚实、并排了解迁移到 Rust 后发生了什么变化的 Go 开发人员。对于故意相反的观点,我建议阅读 Blain Smith 的《Just Fucking Use Go》。同时将两种观点记在脑子里比单独使用其中一种观点更有用。如果您更喜欢观看而不是阅读,请观看上面 Shuttle 文章中的视频,由 Primeagen 阅读并评论:首先了解最重要的命令 Go 开发人员已经拥有业界最干净的工具链之一。过去,它开启了“包含电池”工具链的趋势,为您提供一个单一、一致的界面来构建、测试、格式化、检查和管理依赖项。我很高兴 Rust 也效仿了,因为它是一个很棒的模型。这是关于这两个生态系统我最喜欢的部分之一。 Cargo 甚至还有更多内置功能: Go 工具 Rust 等效项 注释 go.mod / go.sum Cargo.toml / Cargo.lock 项目配置和依赖清单 go get / go mod tidy Cargo add / Cargo update 添加并解析依赖项 go build Cargo build 编译项目 go run 。 cargo run 构建并运行 go test ./...cargo test 测试内置于工具链 go vet ./...cargo Clippy Linter,Clippy 明显比 vet 更有主见 gofmt / goimports Cargo fmt 自动格式化程序,零配置 golangci-lint run Cargo Clippy -- -D 警告 严格 lint 模式 go install ./cmd/foo Cargo install --path 。安装二进制文件 go doc Cargo Doc --open 生成并查看 API 文档 pprof Cargo Flamegraph / Samply CPU 分析 govulncheck Cargo Audit 针对咨询数据库进行漏洞扫描 最大的区别在于,在 Go 中,您通常会使用第三方工具(golangci-lint、mockgen、air、goreleaser)来填补空白。在 Rust 中,第一方生态系统涵盖了更多开箱即用的内容。确实需要外部板条箱的东西(例如,cargo watch、cargo nextest)只需一个命令即可安装,并且感觉很原生,例如Cargo install Cargo-Nextest 立即为您提供 Cargo Nextest。两个社区都对格式化程序有相同的见解:单一的规范样式,即使是不完美的样式,也比它消除的自行车棚更有价值。 Gofmt 的风格没有人喜欢,但 gofmt 却是每个人都喜欢。 — Rob Pike,Go Proverbs rustfmt 也是如此:不是每个人都喜欢每个细节,但代码审查中没有风格争论的价值远远超过您偶尔做出的不同格式偏好。 Go 和 Rust 之间的主要区别 Go Ru