大家好,我是煎鱼。,今天煎鱼和大家一起打开来看看,这能把 Go 错误处理机制给掀开重整不。,来自 PingCAP 的提案作者 @Greg Weber 会干这事基于两个因素,一个是在《Go Developer Survey 2022 Q2 Results[2]》中明确提到。,
,随着 Go1.18 泛型的发布,原先矛盾最深的泛型已经得到一个初步的解决方案。在社区调研上,开发者在使用 Go 时面临的最大挑战已经转移到了错误处理上,需要投入精力去 “解决” 它。,另外一个因素就是众所皆知的,Go 错误处理代码比较繁琐,常被工程师们戏称一个 Go 工程里有 30% 都 if err = nil。,如下代码:,希望让其更优雅。也有许多小伙伴认同这个设计,确实是简单、直观的处理,在社区形成了角力。,本次提案中所提到的解决方案,是增加一个新语句 try ,以此达到简洁的错误处理的作用,让 if err != nil 的处理丝滑起来。,如下代码:,编译器翻译后生成的代码:,在函数中可以如下:,翻译后生成的代码:,也可以只针对 if err != nil 处理。如下代码:,翻译后生成的代码:,不会调用不存在的 handler 进行处理,将会直接返回。三行(if err != nil 的逻辑)直接变 3 个单词(try)。,不想写函数,也可以直接:,针对 defer+try 的场景可以如下:,入参是比较灵活的,作者希望它是泛型,这样能够适配各种场景的要求。,针对本提案,原作者给出了各类使用场景的示例。如下代码:,另外在日常的 Go 工程中,提案作者认为 CopyFile 函数是新提案语句的一种很好的实践。为此基于 try-handler 进行了一版改造和说明。,如下代码:,引入 try-hanlder 后,能够做到:,在这个新提案中,一旦实施,就可以减少如下代码的编写:,在代码编写上会节省一些行数,且可以为错误处理机制引入一些新的 ”操作“,这是该提案的优势。,但是从 Go 开发者的角度而言,会引入一些新的副作用,例如:初学者的学习成本、Go 工具链的改造、程序理解的复杂度增加。,另外新的语句,似乎比较难与 Go1.13 引入的 error.Is 和 As 有较好的相关联性。如果是做一个第三方用户库引入倒可以,但若是作为标准进入 Go 源代码中,似乎又有些格格不入(提案作者希望进入)。,看了那么多提案,Go 错误处理机制的 ”升级“,似乎陷入了手心手背都是肉的阶段...,
© 版权声明
文章版权归作者所有,未经允许请勿转载。