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

扫码关注
分享、点赞、在看就是最大的支持
边栏推荐
- Jerry's serial port receiving IO needs to set the digital function [chapter]
- Getting to know cloud native security for the first time: the best guarantee in the cloud Era
- 吉时利静电计宽测量范围
- Kotlin composite suspend function
- Operation of simulated test question bank and simulated test platform for safety production management personnel of fireworks and firecrackers production units in 2022
- Return to new list
- npm包【详解】(内含npm包的开发、发布、安装、更新、搜索、卸载、查看、版本号更新规则、package.json详解等)
- 记录一次Mongotemplate的And和Or的各种套
- The first open source MySQL HTAP database in China will be released soon, and the three highlights will be notified in advance
- 杰理之可能出现有些芯片音乐播放速度快【篇】
猜你喜欢
随机推荐
The first open source MySQL HTAP database in China will be released soon, and the three highlights will be notified in advance
融云通信“三板斧”,“砍”到了银行的心坎上
返回新列表
HarmonyOS-3
21set classic case
Kotlin anonymous function and lambda
Google Earth engine - Murray global tidal wetland change V1 data set from 1999 to 2019
《中国数据库安全能力市场洞察,2022》报告研究正式启动
杰理之TIMER0 用默认的 PA13 来检测脉宽【篇】
Kotlin coroutine context and scheduler
Gatling 性能测试
2022煤矿瓦斯抽采操作证考试题及模拟考试
JS remove string spaces
2022年烟花爆竹生产单位安全生产管理人员考试题模拟考试题库模拟考试平台操作
In the era of knowledge economy, it will teach you to do well in knowledge management
群晖向阿里云OSS同步
SAP Marketing Cloud 功能概述(三)
kotlin 共享可变状态和并发性
Docker安装redis
Prometheus pushgateway









