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 的吸引力在于:

  1. 零成本抽象:不用担心封装会带来性能损耗。
  2. 没有 GC:从此告别 STW (Stop The World),虽然 Go 的 GC 已经很快了,但有些场景下,完全控制内存是刚需。
  3. 安全性:编译器会在编译阶段就拦下绝大多数内存错误和并发数据竞争问题。

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 可太不一样了。


练习题

  1. 修改 main.rs,让它打印你的名字。
  2. 尝试使用 rustc main.rs 手动编译,感受一下没有 Cargo 的日子。

思考题

为什么 Rust 选择使用宏 (println!) 而不是函数来进行输出?这对性能和功能有什么影响?


本文代码示例


相关阅读