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

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

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

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

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

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

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

快速背景

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

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

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

新提案

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

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

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

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

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

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

演示代码如下:3Mx28资讯网——每日最新资讯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 代码块中是一个变量,符合新语法 “陷阱” 的场景。3Mx28资讯网——每日最新资讯28at.com

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

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

总结

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

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

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

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

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

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

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

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

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

标签:
  • 热门焦点
  • 2023年Q2用户偏好榜:12+256G版本成新主流

    2023年Q2用户偏好榜:12+256G版本成新主流

    3月份的性能榜、性价比榜和好评榜之后,就要轮到2023年的第二季度偏好榜了,上半年的新机潮已经过去,最明显的肯定就是大内存和存储的机型了,另外部分中端机也取消了屏幕塑料支架
  • 十个可以手动编写的 JavaScript 数组 API

    十个可以手动编写的 JavaScript 数组 API

    JavaScript 中有很多API,使用得当,会很方便,省力不少。 你知道它的原理吗? 今天这篇文章,我们将对它们进行一次小总结。现在开始吧。1.forEach()forEach()用于遍历数组接收一参
  • 三言两语说透设计模式的艺术-单例模式

    三言两语说透设计模式的艺术-单例模式

    写在前面单例模式是一种常用的软件设计模式,它所创建的对象只有一个实例,且该实例易于被外界访问。单例对象由于只有一个实例,所以它可以方便地被系统中的其他对象共享,从而减少
  • 使用AIGC工具提升安全工作效率

    使用AIGC工具提升安全工作效率

    在日常工作中,安全人员可能会涉及各种各样的安全任务,包括但不限于:开发某些安全工具的插件,满足自己特定的安全需求;自定义github搜索工具,快速查找所需的安全资料、漏洞poc、exp
  • 破圈是B站头上的紧箍咒

    破圈是B站头上的紧箍咒

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之每年的暑期档都少不了瞄准追剧女孩们的古偶剧集,2021年有优酷的《山河令》,2022年有爱奇艺的《苍兰诀》,今年却轮到小破站抓住了追
  • 阿里大调整

    阿里大调整

    来源:产品刘有媒体报道称,近期淘宝天猫集团启动了近年来最大的人力制度改革,涉及员工绩效、层级体系等多个核心事项,目前已形成一个初步的“征求意见版”:1、取消P序列
  • 小米公益基金会捐赠2500万元驰援北京、河北暴雨救灾

    小米公益基金会捐赠2500万元驰援北京、河北暴雨救灾

    8月2日消息,今日小米科技创始人雷军在其微博上发布消息称,小米公益基金会宣布捐赠2500万元驰援北京、河北暴雨救灾。携手抗灾,京冀安康!以下为公告原文
  • iQOO Neo8系列今日官宣:首发天玑9200+ 全球安卓最强芯!

    iQOO Neo8系列今日官宣:首发天玑9200+ 全球安卓最强芯!

    在昨日举行的的联发科新一代旗舰芯片天玑9200+的发布会上,iQOO官方也正式宣布,全新的iQOO Neo8系列新品将全球首发搭载这款当前性能最强大的移动平台
  • SN570 NVMe SSD固态硬盘 价格与性能兼具

    SN570 NVMe SSD固态硬盘 价格与性能兼具

    SN570 NVMe SSD固态硬盘是西部数据发布的最新一代WD Blue系列的固态硬盘,不仅闪存技术更为精进,性能也得到了进一步的跃升。WD Blue SN570 NVMe SSD的包装外
Top
Baidu
map