写点什么

刷到一个很骚气的 Go 错误处理新提案

  • 2023-11-23
    福建
  • 本文字数:761 字

    阅读完需:约 2 分钟

刷到一个很骚气的 Go 错误处理新提案

在比较一段长的时间里,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 的错误处理合集都已经有许多了。停滞不前中。


文章持续更新中……

用户头像

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
刷到一个很骚气的 Go 错误处理新提案_Go 语言_伤感汤姆布利柏_InfoQ写作社区