大家好,我是建宇。错误处理一直是Go中一个非常有争议的领域,人们对这类提案贡献了各种想法。五一假期期间,我还发现了一个有趣的技术方案,那就是:左边的功能;以及Go+的新思路。今天炸鱼就带大家来看看。Go的新提议:左边的函数是在Go1现有的错误处理机制下,我们在处理错误的时候一般需要写很多iferr!=nil的逻辑。有人开玩笑说100行中有50行如下:funcmain(){x,err:=foo()iferr!=nil{//处理错误}y,err:=foo()iferr!=nil{//处理错误}z,err:=foo()iferr!=nil{//处理错误}s,err:=foo()iferr!=nil{//处理错误}}所以有很多小A伙伴提出了左函数的想法。希望以此来解决错误处理的问题,减少每次写的3行代码,实现一致的错误处理方式。涉及以下提案:《proposal: Go 2: errors: allow function on left hand side of assignment》《proposal: Alternate to try(): 1. Call func/closure from assignment and 2. break/continue/return more than one level: 1. Call func/closure from assignment and 2. break/continue/return more than one level")提案中的新代码如下:fmt.Errof("%v, %w", a, err) := simple()简化写法:errorHandle(err) = io.Copy(w, r)新的处理思路,就是加一层(万能的软件架构处理方式),用左侧函数来处理所有的错误。Go+:错误表达式与 Go 有关系的一员:Go+,也做出了自己的《ErrWrap expressions》错误处理方案,之前的提案有人讨论过,大家可以一起评价一下。表达式引入的核心思想是在错误处理中加入表达式的语法机制。如下:expr!//如果errexpr出现恐慌?//returniferrexpr?:defval//usedefvaliferr让我们一一介绍。表达式表达式!检查valN是否为零。如果没有,它会恐慌。对应的Go代码:val1,val2,...,valN1,valN:=exprifvalN!=nil{panic(errors.NewFrame(valN,...))}val1,val2,...,valN1//的值`expr!`表达式expr?检查valN是否为nil,如果不是则返回错误。对应的Go代码:val1,val2,...,valN1,valN:=exprifvalN!=nil{_ret_err=errors.NewFrame(valN,...)return}val1,val2,...,valN1//valueof`expr?`表达式expr?:defval检查valN是否为nil。如果不是,它使用defval作为expr的值。对应Go代码:val1,val2:=exprifval2!=nil{val1=defval}val1//`expr?:defval`的值Demo代码具体示例代码:import("strconv")funcadd(x,ystring)(int,error){返回strconv.Atoi(x)?+strconv.Atoi(y)?,nil}funcaddSafe(x,ystring)int{returnstrconv.Atoi(x)?:0+strconv.Atoi(y)?:0}println(`add("100","23"):`,add("100","23")!)sum,err:=add("10","abc")println(`add("10","abc"):`,sum,err)println(`addSafe("10","abc"):`,addSafe("10","abc"))输出结果:添加(“100”,“23”):123add(“10”,“abc”):0strconv.Atoi:解析“abc”:语法无效===>错误堆栈:main.add(“10”,"abc")/Users/xsw/goplus/tutorial/15-ErrWrap/err_wrap.gop:6strconv.Atoi(y)?addSafe("10","abc"):10基于表达式的错误处理机制优化In此外,还添加了错误堆栈的信息跟踪。综上所述,在今天的文章中,我们讨论了Go当前“销毁”错误的错误处理机制的建议。有try-catch、panicreplacement等,还有左手函数、表达式等新思想。你怎么看这几种错误处理方式,能解决吗?欢迎在评论区留言交流。文章持续更新中。可以微信搜索【脑补炸鱼】阅读。本文已收录在GitHubgithub.com/eddycjy/blog中。学习Go语言可以看Go学习地图和路线。欢迎星星提醒。阅读更多先睹为快,Go2错误的挣扎我们对Go中的错误处理有4个误解?Go书系列Go语言入门系列:Go项目实战Go语言编程之旅初探:以Go为项目深入使用Go语言设计哲学:Go语言进阶之旅:Go语言进阶之旅:深入Go源代码
