当前位置:网站首页>Go语言三个高效编程的技巧
Go语言三个高效编程的技巧
2022-06-24 13:01:00 【飞雪无情】
点击上方蓝色“飞雪无情”关注我,设个星标,第一时间看文章
Go是一种非常不错的编程语言。它是一种让你真正的关注自己的业务,不必为程序本身操心太多的语言,因此您可以尽快编写应用程序。比如它有比较完整的生态系统,可为你提供入门所需的一切。
但是呢,它也不是万能的,有一些需要我们注意。我写这篇文章主要是为了提醒我自己,也是一些观察和总结。当然,这些只是技巧,并不是真正的问题,当然如果你注意到它们并且在实战中使用,那么将会让你非常受益,这是新手和老手的差别。
不要使用Logrus
这其实和泛型有关。因为Go语言是一门强类型的静态语言,所以你不可能像NodeJS或者PHP那样绕过数据类型。那如果我们还需要使用通用的类型怎么办呢?比如像Loger,或者ORM,因为只有使用了通用的类型,才能编写出通用的代码,不然每个都要写一次。
最终,我们只能用反射。而 Logrus 大量使用反射,这导致大量分配计数。虽然通常不是一个大问题(取决于代码),但性能很重要,尤其是在大规模、高并发的项目中。虽然这听起来像是一个非常小的优化,但避免反射很重要。如果你看到一些可以不考虑类型而使用结构的代码,它会使用反射并且会对性能产生影响。
例如,Logrus 并不关心类型,但显然 Go 需要知道(最终)。Logrus 怎么办呢?使用反射来检测类型,这是开销。
log.WithFields(log.Fields{
"animal": myWhatever,
}).Info("A walrus appears")
所以我会更喜欢zerolog,当然zap也不错。两者都宣称零分配,这也是我们希望的,因为它们的性能影响最小。
不要使用encoding/json
当我们需要一个功能、函数的时候,很多人都建议使用标准库。但是标准库中的encoding/json模块是个例外。其实也和上面的例子一样,encoding/json使用反射,这会导致性能不高,并且在编写返回 json 响应的 API 、或者微服务时会造成损失。
比如你可以使用 Easyjson,它很简单,也很高效,它是使用代码生成器来创建将结构转换为 json 所需的代码,以最大限度地减少分配。这是一个手动构建步骤,很烦人。有趣的是json-iterator也使用反射,但速度明显更快,我怀疑是黑魔法。
尽可能不要在goroutine中使用闭包
比如,下面这个示例代码:
for i:=0;i<10;i++ {
go func() {
fmt.Println(i)
}()
}
大多数人可能期望这会打印数字 0 到 9,就像将任务委托给 goroutine 时那样。
但是实际结果:根据系统,你将得到一两个数字和许多 10。
为什么会这样?闭包可以访问父作用域,因此可以直接使用变量。尽管更新的 linters 可能会警告你“变量闭包捕获”,但并不会要求你重新声明该变量。
Go 的性能名声很大程度上归功于执行的运行时优化,它尝试“猜测”你想要做什么并优化某些执行路径。在此期间,它“捕获”变量并以理论上最有效的方式将它们传递到需要它们的地方(例如,在完成一些非并发操作以释放某些 CPU 上的分配之后)。这种情况下的结果是循环可能会启动 goroutines,goroutines可能会在很晚之后从父作用域接收到 i 的值。不能保证在多次执行此代码时你会看到哪个,可能是数字10,也可以是其他数字。
如果你出于某种原因确实使用了闭包,一定要传递变量i,就像对待每个函数一样对待闭包。
小结
编程实践中的技巧肯定不止这三个,在实践中摸索并掌握他们,可以让我们的编程能力提升,让我们可以写出更优化的代码。
本文为原创文章,转载注明出处,欢迎扫码关注公众号
flysnow_org或者网站 https://www.flysnow.org/ ,第一时间看后续精彩文章。觉得好的话,请猛击文章右下角「在看」,感谢支持。
—— 精彩推荐 ——
动手撸个Caddy(十三)| 插件开发之Caddyfile参数

扫码关注
分享、点赞、在看就是最大的支持
边栏推荐
- 4个不可不知的“安全左移”的理由
- 杰理之检测 MIC 能量自动录音自动播放参考【篇】
- 每日一题day8-515. 在每个树行中找最大值
- Gatling 性能测试
- 融云通信“三板斧”,“砍”到了银行的心坎上
- 杰理之.睡眠以后定时唤醒系统继续跑不复位【篇】
- Google Earth engine - Murray global tidal wetland change V1 data set from 1999 to 2019
- Antd checkbox, limit the selected quantity
- 详解kubernetes备份恢复利器 Velero | 深入了解Carina系列第三期
- [R language data science] (XIV): random variables and basic statistics
猜你喜欢

AntD checkbox,限制选中数量

OpenHarmony 1

markdown/LaTeX中在字母下方输入圆点的方法

一键生成大学、专业甚至录取概率,AI填报志愿卡这么神奇?

智慧园区SaaS管理系统解决方案:赋能园区实现信息化、数字化管理

HarmonyOS-3

Rasa 3. X learning series - it is a great honor to be a source code contributor of Rasa contributors, and to build and share the rasa community with rasa source code contributors all over the world!

Baidu map API drawing points and tips

Activity生命周期

Dragon lizard developer said: first time you got an electric shock, so you are such a dragon lizard community| Issue 8
随机推荐
2022年煤炭生产经营单位(安全生产管理人员)考试题模拟考试平台操作
Prometheus pushgateway
Operation of simulated test question bank and simulated test platform for safety production management personnel of fireworks and firecrackers production units in 2022
每日一题day8-515. 在每个树行中找最大值
万用表的使用方法
win10系统问题
AutoRF:从单视角观察中学习3D物体辐射场(CVPR 2022)
Operation of simulated examination platform of examination question bank for B certificate of Jiangxi provincial safety officer in 2022
详解kubernetes备份恢复利器 Velero | 深入了解Carina系列第三期
Record various sets of and or of mongotemplate once
杰理之.睡眠以后定时唤醒系统继续跑不复位【篇】
Unity 热力图建立方法
Jericho turns on shouting in all modes to increase mic automatic mute [chapter]
Baidu map API drawing points and tips
AntD checkbox,限制选中数量
Can a team do both projects and products?
Rasa 3.x 学习系列-非常荣幸成为 Rasa contributors 源码贡献者,和全世界的Rasa源码贡献者共建共享Rasa社区!
Getting to know cloud native security for the first time: the best guarantee in the cloud Era
快手实时数仓保障体系研发实践
如何在物联网低代码平台中进行任务管理?