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

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

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

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

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

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

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

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

新提案

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

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

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

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

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

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

新的代码如下:K1528资讯网——每日最新资讯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)}

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

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

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

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

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

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

总结

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

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

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

[1]K1528资讯网——每日最新资讯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/65019K1528资讯网——每日最新资讯28at.com

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

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

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

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

标签:
  • 热门焦点
  • 多线程开发带来的问题与解决方法

    使用多线程主要会带来以下几个问题:(一)线程安全问题  线程安全问题指的是在某一线程从开始访问到结束访问某一数据期间,该数据被其他的线程所修改,那么对于当前线程而言,该线程
  • Temu起诉SHEIN,跨境电商战事升级

    来源 | 伯虎财经(bohuFN)作者 | 陈平安日前据外媒报道,拼多多旗下跨境电商平台Temu正对竞争对手SHEIN提起新诉讼,诉状称Shein“利用市场支配力量强迫服装厂商与之签订独家
  • 最“俊美”淘宝卖家,靠直播和短视频圈粉,上架秒光,年销3000万

    来源 | 电商在线文|易琬玉编辑|斯问受访店铺:Ringdoll戒之人形图源:微博@御座的黄山、“Ringdoll戒之人形”淘宝店铺有关外貌的评价,黄山已经听累了。生于1985年的他,哪
  • 梁柱接棒两年,腾讯音乐闯出新路子

    文丨田静 出品丨牛刀财经(niudaocaijing)7月5日,企鹅FM发布官方公告称由于业务调整,将于9月6日正式停止运营,这意味着腾讯音乐长音频业务走向消亡。腾讯在长音频领域还在摸索。为
  • 网红炒股不为了赚钱,那就是耍流氓!

    来源:首席商业评论6月26日高调宣布入市,网络名嘴大v胡锡进居然进军了股市。在一次财经媒体峰会上,几个财经圈媒体大佬就“胡锡进炒股是否知道认真报道”展开讨论。有
  • 冯提莫签约抖音公会 前“斗鱼一姐”消失在直播间

    来源:直播观察提起“冯提莫”这个名字,很多网友或许听过,但应该不记得她是哪位主播了。其实,作为曾经的“斗鱼一姐”,冯提莫在游戏直播的年代影响力不输于现
  • 认真聊聊东方甄选:如何告别低垂的果实

    来源:山核桃作者:财经无忌爆火一年后,俞敏洪和他的东方甄选依旧是颇受外界关心的“网红”。7月5日至9日,为期5天的东方甄选“甘肃行”首次在自有App内直播,
  • 华为Mate 60系列用上可变灵动岛:正式版体验将会更出色

    这段时间以来,关于华为新旗舰的爆料日渐密集。据此前多方爆料,今年华为将开始恢复一年双旗舰战略,除上半年推出的P60系列外,往年下半年的Mate系列也将
  • 上海举办人工智能大会活动,建设人工智能新高地

    人工智能大会在上海浦江两岸隆重拉开帷幕,人工智能新技术、新产品、新应用、新理念集中亮相。8月30日晚,作为大会的特色活动之一的上海人工智能发展盛典人工
Top