当前位置:首页 > 科技  > 软件

用 Switch-case 来解决 Go 错误处理的难题?

来源: 责编: 时间:2024-02-29 14:40:45 299观看
导读大家好,我是煎鱼。在 Go 这门编程语言中,if err != nil 的错误处理方式,是我们一直关注的焦点之一。所有的 Go 社区调查中,都有希望优化和改进错误处理的声音和各种想法。春节期间刷到了一个由 @Bill Soudan 提出的新提案

大家好,我是煎鱼。xOn28资讯网——每日最新资讯28at.com

在 Go 这门编程语言中,if err != nil 的错误处理方式,是我们一直关注的焦点之一。所有的 Go 社区调查中,都有希望优化和改进错误处理的声音和各种想法。xOn28资讯网——每日最新资讯28at.com

春节期间刷到了一个由 @Bill Soudan 提出的新提案《proposal: Go 2: support new form of switch statement during variable assignment which jumps to function-wide case blocks[1]》,是针对错误处理优化的,思路还是有些新奇的。xOn28资讯网——每日最新资讯28at.com

图片图片xOn28资讯网——每日最新资讯28at.com

以往印象里没有人提过这个方式。今天分享给大家,一起围观和学习!xOn28资讯网——每日最新资讯28at.com

新提案

该提案希望在变量赋值时能够支持新的 switch 语句形式。从功能出发,更具体指的是:要支持 switch 跳转到函数范围内的任意位置的标签。xOn28资讯网——每日最新资讯28at.com

这个特性的目的是:简化繁琐又重复的 if err !=nil 的错误检查代码,也可以用于其他逻辑实现。xOn28资讯网——每日最新资讯28at.com

具体的对比例子如下。xOn28资讯网——每日最新资讯28at.com

如果是原本的 Go1 错误处理的范式。xOn28资讯网——每日最新资讯28at.com

代码如下:xOn28资讯网——每日最新资讯28at.com

func CopyFile(src, dst string) error { r, err := os.Open(src) if err != nil {  return err } defer r.Close() w, err := os.Create(dst) if err != nil {  return err } defer w.Close() if _, err := io.Copy(w, r); err != nil {  return err } if err := w.Close(); err != nil {  return err }}

要写比较多的判断和返回错误的逻辑,并且这些代码比正式的调用代码还要多。所以也常被人戏称一个 Go 工程里 80% 都是 if err != nil 等错误检查代码。xOn28资讯网——每日最新资讯28at.com

基于本文提到的 switch-case 提案进行改造。xOn28资讯网——每日最新资讯28at.com

新的代码如下:xOn28资讯网——每日最新资讯28at.com

func CopyFile(src, dst string) error { r, switch err := os.Open(src) defer r.Close() w, switch err := os.Create(dst) defer w.Close() _, switch dstErr := io.Copy(w, r) switch dstErr = w.Close() return nilcase dstErr != nil: os.Remove(dst) err = dstErr fallthroughcase err != nil: return fmt.Errorf("copy %s %s: %v", src, dst, err)}

注意几个细节点:xOn28资讯网——每日最新资讯28at.com

  • switch 关键字在对应的 err 变量前作为声明标识。
  • case 关键字根据对应的 err 变量,运行不同的错误处理逻辑。
  • switch-case 子句可以在同一函数内的不同位置进行调用。

这种 switch-case 的使用方式,从优点来看。确实收拢了统一的错误处理逻辑,减少了重复繁琐的代码量。xOn28资讯网——每日最新资讯28at.com

短短的代码片段,看起来像那么一回事,能一定程度上满足大家原始的诉求。xOn28资讯网——每日最新资讯28at.com

缺点的话,个人认为会增加认知和逻辑复杂度。你根本不知道 switch-case,这个 case 他的准确逻辑位置在哪里。xOn28资讯网——每日最新资讯28at.com

一旦有人套娃,就非常麻烦了。同时 switch-case 延伸出多种不同的使用方式,会产生二义性,这是一个折腾的事情。xOn28资讯网——每日最新资讯28at.com

总结

今天给大家分享了我所看到的一个 Go 错误处理的新提案,其本质上是利用 switch-case 的新语法机制,实现了 err 变量和 case 的关联。以此简化错误检查的逻辑。xOn28资讯网——每日最新资讯28at.com

软件开发是没有银弹的。如何引入更优雅的错误处理机制,且不要带过来过大的程序员心智负担,还要要确保编译器性能尚可。Go 核心团队可能是想要在这三个圈里设计一个最优的选择。xOn28资讯网——每日最新资讯28at.com

参考资料xOn28资讯网——每日最新资讯28at.com

[1]xOn28资讯网——每日最新资讯28at.com

proposal: Go 2: support new form of switch statement during variable assignment which jumps to function-wide case blocks: https://github.com/golang/go/issues/65019xOn28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-75316-0.html用 Switch-case 来解决 Go 错误处理的难题?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 在DDD集成支付宝支付,看这篇文章就够了!

下一篇: 想徒手写个文件系统?来一起呀

标签:
  • 热门焦点
  • 6月安卓手机性价比榜:Note 12 Turbo断层式碾压

    6月份有一个618,虽然这是京东周年庆的日子,但别的电商也都不约而同的跟进了,反正促销没坏处,厂商和用户都能满意。618期间一些产品也出现了历史低价,那么各个价位段的产品性价比
  • 线程通讯的三种方法!通俗易懂

    线程通信是指多个线程之间通过某种机制进行协调和交互,例如,线程等待和通知机制就是线程通讯的主要手段之一。 在 Java 中,线程等待和通知的实现手段有以下几种方式:Object 类下
  • 2023 年的 Node.js 生态系统

    随着技术的不断演进和创新,Node.js 在 2023 年达到了一个新的高度。Node.js 拥有一个庞大的生态系统,可以帮助开发人员更快地实现复杂的应用。本文就来看看 Node.js 最新的生
  • 让我们一起聊聊文件的操作

    文件【1】文件是什么?文件是保存数据的地方,是数据源的一种,比如大家经常使用的word文档、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存数据,它既可以保
  • Temu起诉SHEIN,跨境电商战事升级

    来源 | 伯虎财经(bohuFN)作者 | 陈平安日前据外媒报道,拼多多旗下跨境电商平台Temu正对竞争对手SHEIN提起新诉讼,诉状称Shein“利用市场支配力量强迫服装厂商与之签订独家
  • 大厂卷向扁平化

    来源:新熵作者丨南枝 编辑丨月见大厂职级不香了。俗话说,兵无常势,水无常形,互联网企业调整职级体系并不稀奇。7月13日,淘宝天猫集团启动了近年来最大的人力制度改革,目前已形成一
  • 三星Galaxy Z Fold5今日亮相:厚度缩减但仍略显厚重

    据官方此前宣布,三星将于7月26日也就是今天在韩国首尔举办Unpacked活动,届时将带来带来包括Galaxy Buds 3、Galaxy Watch 6、Galaxy Tab S9、Galaxy
  • iQOO Neo8系列新品发布会

    旗舰双芯 更强更Pro
  • iQOO Neo8系列或定档5月23日:首发天玑9200+ 安卓跑分王者

    去年10月,iQOO推出了iQOO Neo7系列机型,不仅搭载了天玑9000+,而且是同价位唯一一款天玑9000+直屏旗舰,一经上市便受到了用户的广泛关注。在时隔半年后,
Top