Go vs Rust?选 Go
原文由 Matthias Endler 于 发布,订阅该博客
这篇文章写于很久以前,这期间我对其中一些观点的看法已经发生了变化。
为了更平衡地呈现两者的优缺点,我建议阅读我与 Shuttle 合作撰写的另一篇 Go vs Rust 对比文章 🚀
“该选 Rust 还是 Go?”——我经常被问到这个问题。两门语言似乎在争夺同一批用户,而且看起来都属于系统编程语言,那肯定能分出个高下,对吧?
Go:实用、务实、朴实

我不认为 Go 是一门优雅的语言。它最大的特点不是简洁 易用性。Go 甚至算不上是一门系统编程语言。虽然它很适合编写微服务和后端基础设施相关的工具,但我可不想用它来写内核或内存分配器。
但用 Go,你能快速把事做成。
Go 是我用过最高效的语言之一。它的信条就是:今天就解决实际问题。
Rust 强大的保障是有代价的

相比之下,Rust 很难。我花了好几个月才勉强达到能做点东西的水平。你必须投入大量时间才能看到回报。Rust 本身已经是一门强大的语言,而且每天都在变得更强。对我来说,它更像是一门务实的 Haskell,而不是更安全的 C。
别误会:我很喜欢 Rust,它也让我成为了更好的程序员。学习这门语言本身当然很不错。真正的问题在于,它是否适合作为你下一个重要项目的选择。
关键在于:如果你选择 Rust,通常是因为你需要这门语言所提供的那些保障:
- 能够抵御
Null指针、数据竞争和各种底层风险的安全性。 - 可预测的运行时行为(零成本抽象,无垃圾回收)。
- (几乎)完全掌控硬件(内存布局、处理器特性)。
- 与其他语言无缝互操作。
如果你并不需要这些特性中的任何一项,Rust 对你的下一个项目来说可能不是个好选择。因为这些保障是有代价的:上手时间。你需要改掉一些坏习惯,学习全新的概念。很可能在刚开始时,你会频繁地与借用检查器作斗争。
案例分析:试除法判断素数
假设你想判断一个数是否为素数。最简单的方法是检查它能否被任何更小的自然数整除(余数为零)。如果都不能,它就是素数!这种方法被称为试除法。
下面是用 Golang 实现的方法(来自 Rosetta Code):
func IsPrime(n int) bool {
if n < 0 {
n = -n
}
switch {
case n < 2:
return false
default:
for i := 2; i < n; i++ {
if n%i == 0 {
return false
}
}
}
return true
}同样的逻辑用 Rust 实现如下:
pub fn is_prime(n: u64) -> bool {
match n {
0...1 => false,
_ => {
for d in 2..n {
if n % d == 0 {
return false;
}
}
true
}
}
}乍一看,两种解法非常相似。但仔细观察,还是能发现一些差异。
- 在 Go 中,我们使用简单的 switch-case 语句;而在 Rust 中,我们使用
match语句,它要强大得多。 - 在 Go 中,我们用简单的 for 循环遍历 2 到 n 的数字;在 Rust 中,我们使用区间表达式(
2..n)。 - 在 Go 中,我们用了两条
return语句,而在 Rust 中我们只有一个return表达式。一般来说,Rust 中的大多数内容都是表达式,可以被返回并赋值给变量。更多关于表达式的内容,可以在此阅读。
在很多方面,Rust 比 Golang 更具函数式风格。你可以使用为 Range 实现的 any 方法来重写上面的代码。
fn is_prime(n: u64) -> bool {
match n {
0...1 => false,
_ => !(2..n).any(|d| n % d == 0),
}
}起初这可能看起来有点陌生,但过一段时间就会习以为常。
当然,这只是一个简单的例子。建议你去 Rosetta Code 上浏览一些代码,以便对两门语言有更直观的感受。
案例分析:在文本文件中查找重复单词
如果你更偏好看直观演示,这里有一段视频,我分别用 Go 和 Rust 编写了一个简单的并发程序来对比两门语言:
我更喜欢 Go 的一些地方
- 编译速度快
- 务实的问题解决方法
- 针对常见 DevOps 任务的完善生态
- 开箱即用的标准库
- 良好的 IDE 支持
- 简单的错误处理
- 吉祥物 😉
我更喜欢 Rust 的一些地方
- 安全性:没有空指针,没有数据竞争……
- 细粒度的系统控制
- 惊人的运行时速度(可与 C/C++ 媲美)
- 零成本抽象
- 优秀、开放的社区
- 通过 cargo 实现简单的包管理
- 通过 trait 实现的泛型支持
- C 语言互操作和 FFI
结论
99% 的情况下,Go 已经“足够好”,而剩下 1% 不够好的时候,你自己会知道的。到那时再去看看 Rust,因为这两门语言互补性很强。如果你对实战 Rust 咨询感兴趣,可以在我的日历上预约时间,我们来聊聊我能如何提供帮助。
说到底,Rust 和 Go 其实并非竞争对手。
随机一篇博客
评论
登录后参与讨论