前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go 语言怎么优化重复的 if err != nil 样板代码?

Go 语言怎么优化重复的 if err != nil 样板代码?

作者头像
frank.
发布2022-07-01 15:31:47
1.6K0
发布2022-07-01 15:31:47
举报
文章被收录于专栏:Golang语言开发栈

大家好,我是 frank。

01

介绍

Go 语言的错误处理在社区中一直被部分 Go 开发者诟病,其中重复的 if err != nil 样板代码是最令 Go 开发者难以忍受的,严重降低代码的可读性。

针对这个社区争论非常激烈的话题,笔者介绍两种优化重复的 if err != nil 样板代码的方式。

02

封装错误检查函数

错误检查函数示例代码:

代码语言:javascript
复制
func CheckErrors (err error) {
    if err != nil {
        // do something
    }
}

调用错误检查函数示例代码:

代码语言:javascript
复制
err := SomeMethod()
CheckErrors(err)

阅读上面这段代码,封装一个错误检查的函数,代码中需要处理错误的地方,直接调用该函数。

这种方式,虽然在视觉上提升了代码的可读性,但是在需要特殊处理错误的场景也有局限性,比如需要使用额外的信息完善错误时,该方式并不适用此类场景。

03

结构体中定义错误信息字段

我们可以在结构体中定义错误信息字段,将结构体的方法与错误信息绑定在一起。

示例代码:

代码语言:javascript
复制
type Writer struct {
 err error
 buf []byte
 n   int
 wr  io.Writer
}

func (b *Writer) Flush() error {
 if b.err != nil {
  return b.err
 }
 // ...
 return nil
}

阅读 Go 标准库 bufio 的代码片段,我们可以发现在 Writer 结构体中定义一个 err 字段,将错误信息封装在结构体中。

在 Writer 结构体的方法的开头先判断 err 字段是否为 nil,如果 err 字段的值不是 nil,则直接返回 err,从而减少 if err != nil 样板代码的重复出现。

04

总结

本文我们介绍怎么优化 Go 语言中重复的 if err != nil 样板代码的两种方式,笔者推荐使用第二种方式,因为第一种方式虽然简单,但是在一些特定场景并不适合。

通过在结构体中定义错误信息的字段,将结构体的方法和错误信息绑定在一起的优化方式,相比较第一种方式更加优雅。

参考资料:

  1. https://www.reddit.com/r/golang/comments/6v07ij/copypasting_if_err_nil_return_err_everywhere/
  2. https://www.reddit.com/r/golang/comments/649o0c/syncx_go_library_that_extends_standard_sync/
  3. https://go.dev/blog/errors-are-values
  4. https://pkg.go.dev/golang.org/x/sync/errgroup
  5. https://pkg.go.dev/github.com/facebookgo/stackerr#section-readme
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-06-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Go语言开发栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档