Rust 使用 Result 的错误处理方式与 Golang 使用 error 的方式有什么本质区别

最本质的区别是:Golang的错误处理是“积类型”,而的错误处理Rust 是“和类型”。Rust 的 Result 是一种 Monad,从理论上就决定了它比 Go 的多值返回要强大的多。Rust 的错误处理方式是利用了 Monad 概念与控制流操作符,而 Go 的多值返回更像是作者固执己见的设计。

Go 的错误处理是“积类型”,而 Rust 是“和类型”。这是最本质的区别。Golang 错误处理的设计从本质上讲就是错误的。ret 和 err 同时被定义,而在逻辑上,每次只有其中一个不是 nil(另一个 nil 无存在意义)

在实际使用中,当 err 是 nil 的时候,ret 也可以是 nil(均无值)

在实际使用中,当 err 不是 nil 的时候,ret 也可以不是 nil(均有值)

由于 Golang 到目前为止还无法直接定义“和类型”,如果 foo 可能返回两种错误 Error1 和 Error2,你没法保证调用者完全排除了这两种错误的可能性之后才使用数据。

而 Rust 采用了正确的设计,你只能返回一种:要么返回正确,要么返回错误。Golang 最本质的错误就是要求你同时返回两种。

和类型与积类型的区别虽然重要,但不是最主要的不同点。最主要的是,Rust 的 Result 是一种 Monad,从理论上就决定了它比 Go 的多值返回要强大的多。

有类似效果的是 JavaScript 的 Promise,它给回调式 API 来了一波全面打击。链式调用开火车比回调地狱爽多了。

但是 Monad 还不够,人们又折腾出了配套的控制流操作符。

Rust 的问号运算符一出现就把链式调用干翻了。不知道怎么处理错误?打个问号上抛就完事了。要更严谨一点就附加日志、错误消息或类型转换。JS 的 await 配合 Promise,用同步风格写异步,也是相同的道理。

总结,Rust 的错误处理方式是利用了 Monad 概念与控制流操作符,而 Go 的多值返回更像是作者固执己见的设计。

Rust 虽然以 Result 统一了错误表达,但没有统一解决错误链、栈回溯等问题。更强的表达力会带来更大的分裂,不同领域的项目有不同看法,嵌入式项目和 Web 项目显然玩不到一起去。目前最接近大一统目标的是 anyhow 和 thiserror 两个库。其中 anyhow 的 Error 与 Go 的错误接口等效。

Go 的错误处理虽然看起来简陋,但基本实现了统一。我们先不管把 panic/recover 当 throw/catch 用的人。从语言设计的角度,Rust 无疑更好。但从软件工程的角度,各有各的看法,worse is better 再次生效。

延伸阅读:

什么是Golang?

Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译型语言。Go 语言语法与 C 相近,但功能上有:内存安全,GC(垃圾回收),结构形态及 CSP-style 并发计算。

Go(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。

罗伯特·格瑞史莫(Robert Griesemer),罗布·派克(Rob Pike)及肯·汤普逊(Ken Thompson)于2007年9月开始设计Go,稍后Ian Lance Taylor、Russ Cox加入项目。Go是基于Inferno操作系统所开发的。Go于2009年11月正式宣布推出,成为开放源代码项目,并在Linux及Mac OS X平台上进行了实现,后来追加了Windows系统下的实现。在2016年,Go被软件评价公司TIOBE 选为“TIOBE 2016 年优异语言”。 目前,Go每半年发布一个二级版本(即从a.x升级到a.y)。

Go的语法接近C语言,但对于变量的声明有所不同。Go支持垃圾回收功能。Go的并行模型是以东尼·霍尔的通信顺序进程(CSP)为基础,采取类似模型的其他语言包括Occam和Limbo,但它也具有Pi运算的特征,比如通道传输。在1.8版本中开放插件(Plugin)的支持,这意味着现在能从Go中动态加载部分函数。

文章标题:Rust 使用 Result 的错误处理方式与 Golang 使用 error 的方式有什么本质区别,发布者:小编,转载请注明出处:https://worktile.com/kb/p/38504

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小编小编站长
上一篇 2023年2月16日 下午10:57
下一篇 2023年2月16日 下午11:00

相关推荐

  • 如何制定项目计划

    制定项目计划的步骤:1、收集关键利益相关者的要求;2、定义项目范围;3、创建工作分解结构;4、定义项目活动;5、对项目活动进行排序;6、估计活动持续时间、成本和资源等。收集关键利益相关者的要求时,强大的沟通技巧至关重要。 1、收集关键利益相关者的要求 创建项目章程并确定关键项目利益干系人后,收集需求…

    2023年2月9日
    21000
  • 制作路线图用什么软件

    可以用:1. Microsoft PowerPoint;2. Microsoft Visio;3. Lucidchart;4. Trello;5. Notion。Microsoft PowerPoint是一种常用的演示软件,也可以用于制作路线图。它的优点是易于使用,易于导出和共享,而且大多数人都熟悉…

    2023年2月28日
    1.1K00
  • 在vba的选择语句有哪些

    在vba的选择语句有:1、ActiveCell.CurrentRegion.Select 以单元格为基准的选择;2、Range(ActiveCell.End(xlUp),ActiveCell.End(xlDown)).Select 以单元格为基准的选择;3、Cells.Select 工作表的选择等。…

    2023年1月11日
    25700
  • 项目实施进度用什么软件

    项目实施进度用以下软件:一、Microsoft Project;二、Asana;三、GanttProject;四、Smartsheet;五、Trello。Microsoft Project(或MSP)是由微软开发销售的项目管理软件程序。软件设计目的在于协助项目经理发展计划、为任务分配资源、跟踪进度、…

    2023年4月27日
    6700
  • 项目经理和架构师的区别在哪里

    项目经理与架构师的区别涉及:1、定义;2、主要职责;3、所需技能;4、培训背景;5、日常工作;6、与团队的互动。这两个职位在IT和软件开发行业中都十分关键,但它们的角色和责任有所不同。 1、定义 项目经理:负责管理和协调项目的各个阶段,确保项目按计划进行并达到既定目标。 架构师:负责设计和创建软件或…

    2023年7月30日
    14800
  • 如何建立有效的员工福利计划

    有效的员工福利计划对提高员工满意度、减少流失率和吸引优异人才至关重要。本文将分析如何建立有效的员工福利计划,涉及以下几个方面:1、分析员工需求和期望,2、确定合适的福利组合,3、与员工沟通和征询反馈,4、实施和监测福利计划,5、定期评估和调整福利计划。通过确定合适的福利组合,我们可以满足员工的不同需…

    2023年8月9日
    11800
  • 函数与过程的区别是什么

    函数与过程的区别在于:1、概念不同;2、查询不同。其中,概念不同是指,自定义函数诸多限制,有许多语句不能使用,许多功能不能实现。函数可以直接引用返回值,用表变量返回记录集。但是,用户定义函数不能用于执行一组修改全局数据库状态的操作。  一、概念不同 自定义函数诸多限制,有许多语句不能使用,许多功能不…

    2023年2月13日
    53900
  • 云主机可以用来做什么

    云主机可以用来做:1、网站托管;2、利用部署;3、数据库管理;4、数据备份和恢复;5、云存储;6、科学计算。云主机可以用于托管网站,提供网站访问和数据存储的服务。用户可以根据实际需求选择相应的服务器配置和带宽,以满足网站的访问需求。 1、网站托管 云主机可以用于托管网站,提供网站访问和数据存储的服务…

    2023年7月28日
    17700
  • 项目管理软件哪个好用

    好用的项目管理软件有:一、PingCode;二、JIRA;三、tracup;四、coding。PingCode是国内软件研发项目管理软件。功能以及解决的问题有:能够支持看板、敏捷等多种项目的管理;管理团队目标,监控单或多项目的进度、管理计划分配资源、管理团队或个人的工作效率。 一、PingCode …

    2023年4月16日
    9400
  • 如何衡量研发项目的成功

    衡量研发项目成功的标准不仅包括项目的技术完成度,还涵盖了市场接受度、商业目标的实现、团队的成长等方面。确立计量指标时需特别注意的核心观点包括1、技术指标;2、市场指标;3、财务指标;4、时间管理指标;5、团队与组织发展指标。技术指标考量研发成果的创新性与可行性。市场指标评估产品或技术的市场需求与满足…

    2023年11月14日
    1300

发表回复

登录后才能评论
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部