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

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

1.介绍

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

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

2.封装错误检查函数

错误检查函数示例代码:

func CheckErrors (err error) {
if err != nil {
// do something
}
}

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

err := SomeMethod()
CheckErrors(err)

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

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

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

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

示例代码:

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 样板代码的重复出现。

4.总结

本文我们介绍怎么优化 Go 语言中重复的 if err != 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/blog/errors-are-values

https://pkg.go.dev/golang.org/x/sync/errgroup

https://pkg.go.dev/github.com/facebookgo/stackerr#section-readme

责任编辑:武晓燕 来源: Golang语言开发栈
相关推荐

2020-12-17 06:25:05

Gopanic 模式

2022-08-22 07:38:01

Go语言函数

2024-01-02 07:43:47

Go语言静态类型

2021-06-08 07:45:44

Go语言优化

2023-09-12 11:10:00

代码优化Go

2023-12-30 18:35:37

Go识别应用程序

2021-06-10 11:05:04

Java编程代码

2021-12-27 08:53:23

Go函数 Nil

2022-06-05 23:30:25

AES加密算法

2022-11-28 08:15:14

Go语言代码

2022-12-05 09:32:29

Go 语言风格规范

2019-04-24 09:20:58

Go语言编程语言

2022-04-13 08:20:32

DockerGo项目

2022-07-04 14:41:31

Go 语言变长参数变长参数函数

2023-02-13 00:24:37

Go语言日志库

2022-07-03 23:07:48

Go语言参数

2024-04-01 00:02:56

Go语言代码

2024-01-05 07:41:08

Go语言语句

2012-10-08 09:25:59

GoGo语言开发语言

2018-03-12 22:13:46

GO语言编程软件
点赞
收藏

51CTO技术栈公众号