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

相关推荐

  • 资源匮乏如何管理项目进度

    在面临资源匮乏的情况下,管理项目进度需要采取一系列创新和灵活的措施,包括优先级排序、资源再分配、范围调整、强化沟通、以及采用敏捷方法论。这些措施能够保证即便在资源受限的情况下,项目团队也能够有效地推进项目进度,最小化延期风险,并确保项目目标得以实现。特别是,优先级排序在资源紧张时显得尤为重要。通过明…

    2024年4月10日
    5100
  • devops是什么认证

    DevOps,一种极佳的软件开发及交付流程,融合开发与运维团队之间的沟通、协作与整合。1、知名认证机构设有特定的DevOps专业认证路径;2、认证涉及知识域广泛,包含文化理念、实践方法、自动化工具等;3、取得认证可为专业人士带来职业生涯的提升。 当中,DevOps知识域的广泛性,涵盖从代码编写之始至…

    2024年3月26日
    9600
  • 项目管理图有哪些

    项目管理中应用的图形多种多样,每种图形都针对不同的管理需求和分析目的而设计。1) 甘特图、2) CPM(关键路径法)、3) PERT(项目评估与审查技术)、4) 步骤图、5) SWOT分析图、6) RACI图表是其中最常见的六种。甘特图由条形图组成,展现项目各阶段开始和结束的时间点,轻松追踪项目进度…

    2024年1月8日
    34700
  • 流数据和时间序列数据的区别是什么

    区别是:流数据是一组顺序、大量、快速、连续到达的数据序列,一般情况下,流数据可被视为一个随时间延续而无限增长的动态数据集合。时间序列数据是在不同时间上收集到的数据,用于所描述现象随时间变化的情况。 流数据 流数据是一组顺序、大量、快速、连续到达的数据序列,一般情况下,流数据可被视为一个随时间延续而无…

    2023年2月21日
    87800
  • oa管理系统免费版

    OA管理系统免费版本通常提供基础办公自动化功能,如文档管理、任务分配和团队协作等。1、它们可能包括在线日历、项目跟踪和即时通讯工具以支持日常办公需要;2、通常有用户和权限管理功能以确保数据安全;3、可能存在一些广告或功能限制以补偿免费的成本。在这里,详细探讨第3点,即功能限制与广告的存在可能会在一定…

    2024年1月15日
    21500
  • 为什么vscode里面的vue项目

    对不起,但是由于我的设计,我无法在一个回答中生成超过4000字的内容。然而,我能够为你的问题提供一个简要的解答范例和一个更长的文章框架,这应该能帮助你开始撰写有关VSCode中的Vue项目的文章。 简要解答范例 VSCode中的Vue项目之所以受到开发者的青睐,主要有以下几个原因:便捷的项目设置、丰…

    2024年4月3日
    6600
  • 甘特图如何做

    以在PowerPoint 中做甘特图为例,演示做甘特图的步骤:1、创建一个新项目并在其中插入一个表;2、表格填充;3、拆分单元格;4、输入任务的名称等。创建一个新项目并在其中插入一个表是指,在左侧顶部菜单中选择“插入”,再选择“选择表”。 一、做甘特图的步骤 1、创建一个新项目并在其中插入一个表:请…

    2023年2月14日
    59700
  • 企业怎样建设项目

    企业建设项目的步骤是:一、立项审批;二、规划设计;三、 招投标;四、建设工程报建;五、施工许可;六、建设工程竣工验收备案。按照国家规定,所有建设项目必须经过立项审批才能启动,包括项目的可行性研究、环境影响评价等。 一、立项审批 按照国家规定,所有建设项目必须经过立项审批才能启动,包括项目的可行性研究…

    2023年4月16日
    35600
  • 数据库实例是什么

    数据库实例是由一系列的后台进程以及为系统为这些进程分配的内存块组成的。实例可以理解为是我们访问数据库的通道。它有底层软件组织,也可以理解为数据库引擎,用来进行创建、查询、更新和删除数据。除此之外还有内存块,用来存放中间数据。 一、数据库实例简介 数据库实例是由一系列的后台进程以及为系统为这些进程分配…

    2023年3月24日
    2.0K00
  • 团队项目管理软件有什么

    团队项目管理软件有:1、PingCode;2、Worktile;3、Asana;4、禅道;5、Redmine。PingCode是国内国内的一款知名研发项目管理软件,曾在2021年,被知名媒体36氪评为:2021年国内研发项目管理榜单名列前茅的研发项目管理系统。 一、PingCode 这是国内国内的一…

    2023年4月22日
    43500

发表回复

登录后才能评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

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

分享本页
返回顶部