介绍
Go 语言的错误处理在社区中一直被部分 Go 开发者诟病,其中重复的 if err != nil
样板代码是最令 Go 开发者难以忍受的,严重降低代码的可读性。
针对这个社区争论非常激烈的话题,笔者介绍两种优化重复的 if err != nil
样板代码的方式。
封装错误检查函数
错误检查函数示例代码:
func CheckErrors (err error) { if err != nil { // do something } }
调用错误检查函数示例代码:
err := SomeMethod() CheckErrors(err)
阅读上面这段代码,封装一个错误检查的函数,代码中需要处理错误的地方,直接调用该函数。
这种方式,虽然在视觉上提升了代码的可读性,但是在需要特殊处理错误的场景也有局限性,比如需要使用额外的信息完善错误时,该方式并不适用此类场景。
03
结构体中定义错误信息字段
我们可以在结构体中定义错误信息字段,将结构体的方法与错误信息绑定在一起。
示例代码:
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
样板代码的两种方式,笔者推荐使用第二种方式,因为第一种方式虽然简单,但是在一些特定场景并不适合。
通过在结构体中定义错误信息的字段,将结构体的方法和错误信息绑定在一起的优化方式,相比较第一种方式更加优雅。
推荐阅读: