当前位置:网站首页>Go 语言怎么优化重复的 if err != nil 样板代码?
Go 语言怎么优化重复的 if err != nil 样板代码?
2022-07-01 16:11:00 【frank.】
大家好,我是 frank。
01
介绍
Go 语言的错误处理在社区中一直被部分 Go 开发者诟病,其中重复的 if err != nil 样板代码是最令 Go 开发者难以忍受的,严重降低代码的可读性。
针对这个社区争论非常激烈的话题,笔者介绍两种优化重复的 if err != nil 样板代码的方式。
02
封装错误检查函数
错误检查函数示例代码:
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 样板代码的两种方式,笔者推荐使用第二种方式,因为第一种方式虽然简单,但是在一些特定场景并不适合。
通过在结构体中定义错误信息的字段,将结构体的方法和错误信息绑定在一起的优化方式,相比较第一种方式更加优雅。
参考资料:
- 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
边栏推荐
- 怎麼用MySQL語言進行行列裝置?
- Share the daily work and welfare of DJI (Shenzhen headquarters) in Dajiang
- 2022-07-01日报:谷歌新研究:Minerva,用语言模型解决定量推理问题
- laravel的模型删除后动作
- Microservice tracking SQL (support Gorm query tracking under isto control)
- Summer Challenge harmonyos canvas realize clock
- Pico,是要拯救还是带偏消费级VR?
- 制造业数字化转型究竟是什么
- 大龄测试/开发程序员该何去何从?是否会被时代抛弃?
- STM32F1与STM32CubeIDE编程实例-PWM驱动蜂鸣器生产旋律
猜你喜欢

StoneDB 为国产数据库添砖加瓦,基于 MySQL 的一体化实时 HTAP 数据库正式开源!

Do280 management application deployment - pod scheduling control

Automatique, intelligent, visuel! Forte conviction des huit conceptions derrière la solution sslo

制造业数字化转型究竟是什么

#夏日挑战赛# HarmonyOS canvas实现时钟

瑞典公布决定排除华为5G设备,但是华为已成功找到新出路

There is a difference between u-standard contract and currency standard contract. Will u-standard contract explode

Go language learning notes - Gorm use - table addition, deletion, modification and query | web framework gin (VIII)

Programming examples of stm32f1 and stm32subeide - production melody of PWM driven buzzer

Use Tencent cloud to build a map bed service
随机推荐
Korean AI team plagiarizes shock academia! One tutor with 51 students, or plagiarism recidivist
【Hot100】17. 电话号码的字母组合
Uncover the "intelligence tax" of mousse: spend 4billion on marketing, and only 7 invention patents
Crypto Daily: Sun Yuchen proposed to solve global problems with digital technology on MC12
Win11如何设置用户权限?Win11设置用户权限的方法
How to write good code - Defensive Programming Guide
嵌入式开发:5个修订控制最佳实践
MySQL的零拷贝技术
Comment win11 définit - il les permissions de l'utilisateur? Win11 comment définir les permissions de l'utilisateur
Overview | slam of laser and vision fusion
【Hot100】19. 删除链表的倒数第 N 个结点
动作捕捉系统用于苹果采摘机器人
Five years after graduation, I became a test development engineer with an annual salary of 30w+
Problèmes rencontrés dans le développement de la GI pour maintenir le rythme cardiaque en vie
复杂度相关OJ题(LeetCode、C语言、复杂度、消失的数字、旋转数组)
圈铁发音,动感与无噪强强出彩,魔浪HIFIair蓝牙耳机测评
There will be a gap bug when the search box and button are zoomed
Go language learning notes - Gorm use - table addition, deletion, modification and query | web framework gin (VIII)
普通二本,去过阿里外包,到现在年薪40W+的高级测试工程师,我的两年转行心酸经历...
Some abilities can't be learned from work. Look at this article, more than 90% of peers