也许是最客观、全面的比较 Rust 与 Go,值得你读( 三 )


Rust 为准备接受更复杂的语法和语义(可能会带来更高的可读性成本)以换取最大可能的性能的程序员 , 与 C++ 和 D 竞争思想共享 。 Dave Cheney[9]
并发大多数语言都对并发编程提供某种形式的支持(一次执行多项操作) , 但是 Go 是专为这项工作而设计的 。 Go 不使用操作系统线程 , 而是提供了一种轻量级的替代方案:goroutines 。 每个 goroutine 是一个独立执行的 Go 函数 , Go 调度程序会将其映射到其控制下的 OS 线程之一 。 这意味着调度程序仅使用有限数量的 OS 线程即可非常有效地管理大量并发的goroutine 。
因此 , 你可以在一个程序中运行数百万个并发 goroutine , 而不会造成严重的性能问题 。 这使 Go 成为 Web 服务器和微服务等大规模并发应用程序的理想选择 。
Go 还提供了快速 , 安全 , 有效的方式 , goroutine 使用 channel 进行通信和共享数据 。 Go 的并发支持设计良好 , 使用起来很愉快 。 通常很难对并发程序进行推理 , 而构建可靠 , 正确的并发程序对任何语言都是一个挑战 。 但是 , 由于它是从一开始就内置在语言中的 , 而不是事后才想到的 , Go 中的并发编程简单、合理、良好的集成进语言中 。
Go 使构建易于分解的应用程序变得非常容易 , 该应用程序在作为一组微服务部署时充分利用了并发性 。 Rust 也可以做这些事情 , 但是可以说有点困难 。 从某些方面来说 , Rust 对防止与内存相关的安全漏洞的痴迷意味着程序员必须竭尽全力来执行使用其他语言(包括 Go)更简单的任务 。 Sonya Koptyev[10]
相比之下 , Rust 中的并发是一个很新的特性 , 并且还有待稳定中 , 但是它的发展非常活跃 , 因此请留意这块 。 例如 , Rust 的 rayon[11] 提供了一种非常优雅且轻巧的方法 , 可以将顺序计算转换为并行计算 。
具有轻量级 Goroutine 和 Channel 语法确实很棒 。 它确实显示出语法的威力 , 即如此小的细节使并发编程比其他语言感觉更好 。 — Rust 程序员对 Go 的早期印象[12]
虽然在 Rust 中实现并发程序可能会不太直接 , 但仍然可以实现 , 并且这些程序可以利用 Rust 的安全保证 。 标准库的 Mutex 类就是一个很好的例子:在 Go 中 , 你可以忘记在访问某些东西之前先获得一个互斥锁 , 但是 Rust 不允许你这样做 。
Go 将并发作为第一类概念 。 这并不是说你无法在 Rust 中找到类似 Go 的并发方式 , 而是留给程序员练习 。 Dave Cheney[13]
安全性前面我们已经看到 , Go 和 Rust 都以不同的方式来防止与内存管理有关的大量常见编程错误 。 但是 , 尤其是 Rust 会竭尽全力确保你不会做本不该做的不安全的事情 。
Rust 的程序编辑器非常严格且学究(pedantic) , 它会检查你使用的每个变量以及引用的每个内存地址 。 它避免了可能的数据争用情况 , 并通知你有关未定义行为的信息 。 从根本上讲 , 并发和内存安全问题根本不可能进入Rust的安全子集 。 Why Rust?[14]
这会使 Rust 中的编程成为几乎所有其他语言的不同体验 , 而且一开始可能具有挑战性 。 但对很多人来说 , 努力工作是值得的 。
对我来说 , Rust 的主要优点是感觉编译器成为我的靠山 , 不会让任何错误漏出(有时感觉像魔术) 。 —Grzegorz Nosek
包括 Go 在内的许多语言都具有帮助程序员避免错误的功能 , 但是 Rust 将其提升到了一个新的高度 , 因此潜在的错误程序甚至无法编译 。
使用 Rust , 库程序员可以使用很多工具来防止用户犯错误 。 Rust 使我们能够说我们拥有特定的数据 。 其他任何人都不可能拥有所有权 , 因此我们知道其他任何人都无法对其进行修改 。 我想不到曾经有过这么多工具来防止意外滥用 。 真是太好了 。 Sam Rose[15]
对于新手 Rust 程序员来说 , “与借阅检查器(borrow checker)打架”是一个常见的症状 , 但是在大多数情况下 , 它发现的问题是代码中的真正错误(或至少是潜在的错误) 。 这可能会迫使你从根本上重新架构程序 , 以避免遇到这些问题 。 当正确性和可靠性是你的重中之重时 , 这是一件好事 。 语言不会改变编程方式的重点是什么?当你使用其他语言工作时 , Rust 讲授的有关安全性的课程也会很有用 。
如果选择 Rust , 通常需要该语言提供的保证:防止空指针和数据竞争的安全性 , 可预测的运行时行为以及对硬件的完全控制 。 如果你不需要这些功能 , Rust 对于你的下一个项目可能不是一个好的选择 。 这是因为这些保证要付出一定的代价:学习坡度 , 时间问题 。 你将需要学习不良习惯并学习新概念 。 很有可能 , 刚开始时 , 你将与借阅检查器进行很多斗争 。