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

    Go 新提案:用 #err 标识符去做错误处理!

    煎鱼发表于 2024-06-06 12:31:28
    love 0

    大家好,我是煎鱼。

    前几天看 Reddit 社区里的讨论,发现 Go 这一门编程语言,错误处理永远是讨论的议题之一。本着追踪网友脑洞 Proposal 的基础上,周末看到个被反对比较多的 Go2 错误处理提案。

    今天结合分享给大家,好的坏的都可以围观一下。

    问题背景

    在 Go 这门编程语言中,错误处理机制主要是依赖于 if err != nil 的方式。因此在对函数做一定的封装后。

    代码最终常呈现出以下样子:

    jy1, err := GetFoo()
    if err != nil {
        return err
    }
    jy2, err := SliceTheBar(varFoo)
    if err != nil {
        return err
    }
    err := CheckBarSlice(sliceBar)
    if err != nil {
        return err
    }
    ...

    有部分开发者会认为这比较的丑陋、混乱且难以阅读。

    有人戏称一个 Go 工程里有 60% 的代码是 if err != nil,为此我见过直接用 panic 来做错误处理的团队。

    新提案:用 #err 作为标识符

    提案的提出者 @mainjzb,主要的设计目标是:将 # 作为错误符号,格式上将 #@ 作为处理程序错误符号。帮助开发者阅读代码并简化代码。

    原本 Go 错误处理方式,如下老代码:

    n, err := io.Write(x)
    n, _ := io.Write(x) 
    
    n, err := io.Write(x)
    if err != nil {
       return 0, err
    }
    
    n, err := io.Write(x)
    if err != nil {
       return 0, fmt.Error("tcp closed: %w", err)
    }
    
    n, err := io.Write(x)
    if err != nil{
        panic(err)
    }

    使用上述提案后的错误标识改造后,新的代码如下:

    // 1. err as value
    n := io.Write(x) #err       
    
    // 2. ignore error
    n := io.Write(x) #@ignore   
    
    //  3. return error immediately、
    n := io.Write(x) #@done     
    
    // 4. wrap additional information
    n := io.Write(x) #@wrap("tcp closed: %w") 
    
    // 5. panic err
    n := io.Write(x) #@must     
    1. #err 标识符:err 变量作为值,一切与以前 error 一样。只是变成了 #err 的标识用法。
    2. #@ignore 标识符:使忽略错误变得比以前更易读,也可以用附加的描述信息便于开发者阅读。
    3. #@done 标识符:直接返回错误信息。很多时候(特别是在库中),只需要返回错误,无需执行任何操作。例如:url.parseAuthority。
    4. #@wrap 标识符:在 error 上附带更多的错误信息,例如:#@wrap 等于 #@wrap("io.Wirite err:")。
    5. #@must 标识符:这个标识符可以在产生错误时,直接发生 panic 事件。

    总结

    这个提案的作者有多门编程语言经验,本次提出的新提案,很明显是瞄着解决 Go 这门编程语言中的 if err != nil 的不断重复的代码内容的方向去的。

    虽然原提案作者另辟蹊径,通过增加 #err 这类标识符来直接扭转错误处理,解决了大量重复 err 代码。

    但最终与 Go 语言的其他部分过于不适。已经被 ban 了。谨记:想要优化 GO 的 if err != nil 还得要考虑整体适合度,不能一厢情愿。

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

    推荐阅读

    • 优秀开源项目 gogo/protobuf 已经凉了。。。
    • Google 如果把 Go 团队给裁了会怎么样?
    • 为什么 Go protobuf 不支持标签注入?


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