• 在GitHub上刷到一个比较骚的 Go 错误处理新提案
  • 发布于 2个月前
  • 159 热度
    0 评论
  • Scys
  • 5 粉丝 39 篇博客
  •   
在比较一段长的时间里,Go 的错误处理已经没有什么特别的进展和新改进了。看着已经到了瓶颈期。今天在 GitHub 上学习时,看到 Go 社区里有人提了个错误处理的优化提案《proposal: Go 2: Error-Handling Paradigm with !err Grammar Sugar[1]》,也是引入新的语法来解决该问题。大家一起来看看,也集思广益一下。原提案作者的目的是新增一个 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:
    // 堆代码 duidaima.com
    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 变量进行监听和处理。本提案还在等待作者补充更多的语言变更的实现细节。不过截至目前为止,吐槽是不少的。

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


参考资料
[1]proposal: Go 2: Error-Handling Paradigm with !err Grammar Sugar: https://github.com/golang/go/issues/63961

用户评论