Rust 学习笔记 01:简介与环境搭建
“A language that doesn’t affect the way you think about programming, is not worth knowing.” – Alan Perlis
作为一名写了几年 Go 的程序员,习惯了 GC 的安逸,也忍受了 if err != nil 的繁琐。一直听说 Rust 有多强,但每次看到那陡峭的学习曲线和满屏的生命周期引用,都默默劝退。
2024 年了,是时候走出舒适区,挑战一下这个"编译器教你做人"的语言了。
这系列笔记不是官方教程的复读机,而是从一个 Go/Java 开发者的视角,记录学习过程中的困惑、对比和感悟。
1. 为什么要折腾自己?
如果 Go 是一把瑞士军刀,简单实用;那 Rust 就像是一把手术刀,精准锋利,但由于太锋利,很容易割到手。
对于 Go 开发者来说,Rust 的吸引力在于:
- 零成本抽象:不用担心封装会带来性能损耗。
- 没有 GC:从此告别 STW (Stop The World),虽然 Go 的 GC 已经很快了,但有些场景下,完全控制内存是刚需。
- 安全性:编译器会在编译阶段就拦下绝大多数内存错误和并发数据竞争问题。
2. 环境搭建
Rust 的安装体验和 Go 差不多,甚至更现代。
macOS/Linux 一行命令搞定:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
这里有几个核心概念:
- rustup: 版本管理器。类似于 Python 的 pyenv 或 Node 的 nvm。它可以轻松切换 stable/nightly 版本。
- cargo: 包管理器 + 构建工具。这是 Rust 最让人羡慕的地方。它把 go mod, ago build, go test, go run 全包了,而且体验极佳。
- rustc: 编译器。平时基本不用直接调它,Cargo 会帮我们打理好一切。
检查版本:
cargo --version
3. Hello, World!
Go 语言里我们习惯直接 go run main.go。Rust 里我们推荐用 Cargo 创建项目。
cargo new ch01-hello-world
cd ch01-hello-world
Cargo 生成的目录及 Cargo.toml (类似 go.mod) 非常清爽。
看看 src/main.rs:
fn main() {
println!("Hello, world!");
}
和 Go 的对比:
fn定义函数 (Go 用func)。println!是个宏 (Macro),注意那个感叹号。Go 的fmt.Println是函数。宏在编译期展开,而函数在运行时调用。- 分号
;必须写!(Go 开发者会经常忘记 😄,除非是表达式返回值,后面会学到)。
运行它:
cargo run
4. 小结
第一天,主要是通过 rustup 装好了环境,体验了一下 cargo 的便利。
目前感觉:
- Cargo 真香,比早期的 GOPATH 好用太多。
- 语法看起来并没有想象中那么吓人(目前为止)。
- 编译器输出的错误信息非常友好(虽然今天没遇到错误),听说它是最好的编程搭子。
下一篇,我们将深入变量和可变性。听说 Rust 的变量默认不可变?这和 Go 的 var 可太不一样了。
练习题:
- 修改
main.rs,让它打印你的名字。 - 尝试使用
rustc main.rs手动编译,感受一下没有 Cargo 的日子。
思考题:
为什么 Rust 选择使用宏 (println!) 而不是函数来进行输出?这对性能和功能有什么影响?
本文代码示例: