当前位置:网站首页>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参数

扫码关注
分享、点赞、在看就是最大的支持
边栏推荐
- Kotlin anonymous function and lambda
- 远程办公之:在家露营办公小工具| 社区征文
- 2022 Quality Officer - Equipment direction - post skills (Quality Officer) recurrent training question bank and online simulation examination
- Eight major trends in the industrial Internet of things (iiot)
- 杰理之可能出现有些芯片音乐播放速度快【篇】
- 二造考生必看|巩固优选题库助力考生最后冲刺
- kotlin 组合挂起函数
- Android kotlin Encyclopedia
- 图扑软件数字孪生海上风电 | 向海图强,奋楫争先
- Operation of simulated examination platform for examination questions of coal production and operation units (safety production management personnel) in 2022
猜你喜欢

Mit-6.824-lab4a-2022 (ten thousand words explanation - code construction)

How to manage tasks in the low code platform of the Internet of things?

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

《中国数据库安全能力市场洞察,2022》报告研究正式启动

OpenHarmony 1

Daily question 8-515 Find the maximum value in each tree row

【R语言数据科学】(十四):随机变量和基本统计量

Google waymo proposed r4d: remote distance estimation using reference target

#21Set经典案例

国内首款开源MySQL HTAP数据库即将发布,三大看点提前告知
随机推荐
2022年江西省安全员B证考试题库模拟考试平台操作
2022年氟化工艺考试模拟100题及答案
Use of kotlin arrays, collections, and maps
The project manager needs to look at six characteristics to build a team
HarmonyOS.2
杰理之.睡眠以后定时唤醒系统继续跑不复位【篇】
SAP Marketing Cloud 功能概述(三)
Operation of simulated examination platform of examination question bank for B certificate of Jiangxi provincial safety officer in 2022
2022年烟花爆竹生产单位安全生产管理人员考试题模拟考试题库模拟考试平台操作
Antd checkbox, limit the selected quantity
AQS初探
English writing of Mathematics -- Basic Chinese and English vocabulary (common vocabulary of geometry and trigonometry)
Android kotlin Encyclopedia
Ti Xing Shu'an joined the dragon lizard community to jointly create a network security ecosystem
#21Set经典案例
Hardware development notes (6): basic process of hardware development, making a USB to RS232 module (5): creating USB package library and associating principle graphic devices
HarmonyOS. two
90%的项目经理都跳过的坑,你现在还在坑里吗?
杰理之红外滤波【篇】
PM should also learn to reflect every day