IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    刷到一个比较骚的 Go 错误处理新提案。。。

    煎鱼发表于 2023-11-20 12:31:12
    love 0

    大家好,我是煎鱼。

    在比较一段长的时间里,Go 的错误处理已经没有什么特别的进展和新改进了。看着已经到了瓶颈期。

    今天在 GitHub 上学习时,看到 Go 社区里有人提了个错误处理的优化提案《proposal: Go 2: Error-Handling Paradigm with !err Grammar Sugar》,也是引入新的语法来解决该问题。

    大家一起来看看,也集思广益一下。原提案作者的目的是新增一个 listen 关键字和配合管道符等语法来实现新的错误处理。

    原本的 Go1 代码,我们在处理错误时需要使用 if err != nil。如下代码:

    func copy(src, dst string) (int64, error) {
        r, err := os.Open("input.txt")
        if err != nil {
            return 0, err
        }
        defer r.Close()
     
        w, err := os.Create("output.txt")
        if err != nil {
            return 0, err
        }
        defer w.Close()
        
        if _, err = io.Copy(w, r); err != nil {
            return 0, err
        }
        return 0, err
    }

    本提案的变化是:新增一个 listen 关键字,用于监听 err 变量,再配合 "|" 管道符来实现新的错误处理机制。

    如下演示代码:

    listen: err {
        if err != nil  {
            return 0, err
        }
        return 0, nil
    }()
    
    func copy(src, dst string) (int64, error) {
        listen:
        
        r, err := os.Open("input.txt")
        defer r.Close()
     
        w, err := os.Create("output.txt")
        defer w.Close()
    
        _, err = io.Copy(w, r) 
    }

    listen 关键字监听了 err 变量,再在上述的代码块中进行统一的错误逻辑处理。

    如果是多个 err 变量,会是如下处理方式:

    listen: err | err2 {
        if err != nil  {
            return 0, err
        }
        return 0, nil
    }()

    增加了管道符,同时对 err 和 err2 变量进行监听和处理。

    本提案还在等待作者补充更多的语言变更的实现细节。不过截至目前为止,吐槽是不少的。

    大家对此有没有更好的建议和想法呢?

    Go 的新错误处理的改造方向真的是让人头大。我这边有记载被 ban 的错误处理合集都已经有许多了。停滞不前中。

    文章持续更新,可以微信搜【脑子进煎鱼了】阅读,本文 GitHub github.com/eddycjy/blog 已收录,学习 Go 语言可以看 Go 学习地图和路线,欢迎 Star 催更。

    推荐阅读

    • Go etcd 的依赖问题终于解决了。。。
    • Go 项目标准布局?Go 官方出指南了
    • 互联网公司裁员的预兆和手段


沪ICP备19023445号-2号
友情链接