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

Go 错误处理:用 select-case 来解决这个历史难题?

来源: 责编: 时间:2024-03-18 09:42:23 273观看
导读大家好,我是煎鱼。日常看 Go 社区的一些新动态,发现大家对于错误处理的新提案是很积极。上次分享了一篇想要用 switch-case 来解决现状的新提案,不少同学认为不可行。没想到 Go 社区的同学脑洞还是很大的,这几天又整出来

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

日常看 Go 社区的一些新动态,发现大家对于错误处理的新提案是很积极。上次分享了一篇想要用 switch-case 来解决现状的新提案,不少同学认为不可行。mnv28资讯网——每日最新资讯28at.com

没想到 Go 社区的同学脑洞还是很大的,这几天又整出来个 select-case 的新提案的方式来解决错误处理。mnv28资讯网——每日最新资讯28at.com

今天基于此给大家分享一下社区里的新脑洞。mnv28资讯网——每日最新资讯28at.com

快速背景

本节的背景主要是给不了解的同学拉通一下。如果已经知道的可以跳过本节。新提案的提出背景,与之前的类似。mnv28资讯网——每日最新资讯28at.com

社区内的 Go 开发者很多嫌弃 if err != nil 的错误处理方式过于繁琐,纷纷提出各种改进方式和新提案。截至目前暂无大改进被通过。mnv28资讯网——每日最新资讯28at.com

具体演示代码如下:mnv28资讯网——每日最新资讯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 等错误检查代码。mnv28资讯网——每日最新资讯28at.com

新提案

本次新提案是由 @bjorndm 提出的 《proposal: Go 2: add trap on direct assignment with select block[1]》:mnv28资讯网——每日最新资讯28at.com

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

提出者本身使用编程语言的经验比较丰富,用过:C, Ruby, Pascal, Basic, Java, Shell 等。本次提出该提案的原因是某些 shell 中 trap 语句的启发。mnv28资讯网——每日最新资讯28at.com

抽象了一下,提案内容如下:mnv28资讯网——每日最新资讯28at.com

  1. 功能上是要扩展 select 关键字的语法,允许在 select 关键字和其代码块之间放一个单独的变量,这会在变量上安装一个 “陷阱”(类似触发器)。
  2. 这个 “陷阱” 是关键点,当任何值被赋给该变量时将会触发。然后在 select 代码块的主体中,case 语句可用于检查变量的值。

从原作者的描述来看,提案内容比较生硬。我们结合演示代码来看就知道,他是想构思什么新语法来使用 select-case 达到错误处理的目的了。mnv28资讯网——每日最新资讯28at.com

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

func CanFail(name string) error {var err errorselect err {      case err != nil:          return fmt.Errorf("CanFail: %w", err)}fin, err := os.Open(name)buf, err := io.ReadAll(fin)return nil}

结合新提案的语法,由于 select 代码块中是一个变量,符合新语法 “陷阱” 的场景。mnv28资讯网——每日最新资讯28at.com

因此 err 变量被安装了 “陷阱”,当后面的 os.Open 和 io.ReadAll 等方法赋值给 err 变量时,就能触发 select 子句的 case 检查。mnv28资讯网——每日最新资讯28at.com

最终以此达到简化 if err != nil 的目的。也可以满足 Go1 兼容性保障,达到向前和向后兼容,不需要新增关键字。mnv28资讯网——每日最新资讯28at.com

总结

截止目前我们已经看过了许多 Go 错误处理的脑洞新提案。本提案是期望利用 select-case 的特性结构来做扩展,以此达到向前兼容的目的。mnv28资讯网——每日最新资讯28at.com

从编译和运行上,作者认为代价是比较小的,只需要在内部替换成类似 switch 的效果就可以了。mnv28资讯网——每日最新资讯28at.com

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

[1]proposal: Go 2: add trap on direct assignment with select block: https://github.com/golang/go/issues/66161mnv28资讯网——每日最新资讯28at.com

mnv28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-76540-0.htmlGo 错误处理:用 select-case 来解决这个历史难题?

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

上一篇: 赠你13张图,助你20分钟打败了「V8垃圾回收机制」!!!

下一篇: Sharding-JDBC源码解析与vivo的定制开发

标签:
  • 热门焦点
  • 小米官宣:2023年上半年出货量中国第一!

    今日早间,小米电视官方微博带来消息,称2023年小米电视上半年出货量达到了中国第一,同时还表示小米电视的巨屏风暴即将开始。“公布一个好消息2023年#小米电视上半年出货量中国
  • 天猫精灵Sound Pro体验:智能音箱没有音质?来听听我的

    这几年除了手机作为智能生活终端最主要的核心之外,第二个可以成为中心点的产品是什么?——是智能音箱。 手机在执行命令的时候有两种操作方式,手和智能语音助手,而智能音箱只
  • 6月安卓手机好评榜:魅族20 Pro蝉联冠军

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年6月1日至6月30日,仅限国内市场。第一名:魅族20 Pro好评率:95%5月份的时候魅族20 Pro就是
  • JavaScript 混淆及反混淆代码工具

    介绍在我们开始学习反混淆之前,我们首先要了解一下代码混淆。如果不了解代码是如何混淆的,我们可能无法成功对代码进行反混淆,尤其是使用自定义混淆器对其进行混淆时。什么是混
  • 虚拟键盘 API 的妙用

    你是否在遇到过这样的问题:移动设备上有一个固定元素,当激活虚拟键盘时,该元素被隐藏在了键盘下方?多年来,这一直是 Web 上的默认行为,在本文中,我们将探讨这个问题、为什么会发生
  • JVM优化:实战OutOfMemoryError异常

    一、Java堆溢出堆内存中主要存放对象、数组等,只要不断地创建这些对象,并且保证 GC Roots 到对象之间有可达路径来避免垃 圾收集回收机制清除这些对象,当这些对象所占空间超过
  • 猿辅导与新东方的两种“归途”

    作者|卓心月 出品|零态LT(ID:LingTai_LT)如何成为一家伟大企业?答案一定是对“势”的把握,这其中最关键的当属对企业战略的制定,且能够站在未来看现在,即使这其中的
  • iQOO 11S或7月上市:搭载“鸡血版”骁龙8Gen2 史上最强5G Soc

    去年底,iQOO推出了“电竞旗舰”iQOO 11系列,作为一款性能强机,iQOO 11不仅全球首发2K 144Hz E6全感屏,搭载了第二代骁龙8平台及144Hz电竞屏,同时在快充
  • 外交部:美方应停止在网络安全问题上不负责任地指责他国

      中国外交部今天(16日)举行例行记者会。会上,有记者问,美国情报官员称,他们正在阻拦来自中国以及其他国家的黑客获取相关科研成果。 中方对此有何评论?对此
Top