当前位置: 首页 > 科技观察

Go语言如何优化重复的iferr!=nil样板代码?

时间:2023-03-17 09:58:14 科技观察

1。简介Go语言的错误处理一直受到社区中一些Go开发者的批评。重复的iferr!=nil样板代码是Go开发者最难以忍受的,严重降低了代码的可读性。针对这个社区热议的话题,作者介绍了两种优化重复iferr!=nil样板代码的方法。2.封装错误检查函数错误检查函数示例代码:funcCheckErrors(errerror){iferr!=nil{//dosomething}}调用错误检查函数示例代码:err:=SomeMethod()CheckErrors(err)读取上面这段代码封装了一个错误检查函数,在代码中需要处理错误的地方,直接调用这个函数即可。这种方式虽然在视觉上提高了代码的可读性,但在需要对错误进行特殊处理的场景下也存在局限性。例如,当需要使用额外的信息来改善错误时,这种方法不适合此类场景。3.在结构体中定义错误信息字段我们可以在结构体中定义错误信息字段,将结构体的方法与错误信息进行绑定。示例代码:typeWriterstruct{errerrorbuf[]bytenintwrio.Writer}func(b*Writer)Flush()error{ifb.err!=nil{returnb.err}//...returnnil}阅读Go标准库中bufio的代码片段,我们可以发现在Writer结构体中定义了一个err字段,该结构体中封装了错误信息。Writer结构体的方法一开始先判断err字段是否为nil。如果err字段的值不为nil,则直接返回err,从而减少iferr!=nil样板代码的重复。4.总结在本文中,我们介绍了两种优化Go语言中重复的iferr!=nil样板代码的方法。笔者推荐第二种方式,因为第一种方式简单,但不适合某些特定场景。通过在结构体中定义错误信息的字段,将结构体的方法与错误信息绑定的优化方法比第一种方法更加优雅。参考:https://www.reddit.com/r/golang/comments/6v07ij/copypasting_if_err_nil_return_err_everywhere/https://www.reddit.com/r/golang/comments/649o0c/syncx_go_library_that_extends_standard_sync/https://go.dev/博客/错误是价值https://pkg.go.dev/golang.org/x/sync/errgrouphttps://pkg.go.dev/github.com/facebookgo/stackerr#section-readme