大家好,我是煎鱼。
前几天看 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 来做错误处理的团队。
提案的提出者 @mainjzb,主要的设计目标是:将 # 作为标识位,格式上是把 #xxx 作为程序处理错误的标识符。帮助开发者阅读代码并简化代码。
原本 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 valuen := io.Write(x) #err // 2. ignore errorn := io.Write(x) #@ignore // 3. return error immediately、n := io.Write(x) #@done // 4. wrap additional informationn := io.Write(x) #@wrap("tcp closed: %w") // 5. panic errn := io.Write(x) #@must
结合上述提案改进后的代码,原作者给出了以下几种 # 标识符的想法:
这个提案的作者有多门编程语言经验,本次提出的新提案,很明显是瞄着解决 Go 这门编程语言中的 if err != nil 的不断重复的代码内容的方向去的。
虽然原提案作者另辟蹊径,通过增加 #err 这类标识符来直接扭转错误处理,解决了大量重复 err 代码。
图片
但最终与 Go 语言的其他部分过于不适。已经被 ban 了。谨记:想要优化 GO 的 if err != nil 还得要考虑整体适合度,不能一厢情愿。
本文链接:http://www.28at.com/showinfo-26-92114-0.htmlGo 新提案:用 #err 标识符去做错误处理!
声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com