Go语言高效编程的3个技巧总结

作者:InterestingFigure 时间:2024-02-03 02:52:38 

不要使用Logrus

这其实和泛型有关。因为Go语言是一门强类型的静态语言,所以你不可能像NodeJS或者PHP那样绕过数据类型。那如果我们还需要使用通用的类型怎么办呢?比如像Loger,或者ORM,因为只有使用了通用的类型,才能编写出通用的代码,不然每个都要写一次。

最终,我们只能用反射。而 Logrus 大量使用反射,这导致大量分配计数。虽然通常不是一个大问题(取决于代码),但性能很重要,尤其是在大规模、高并发的项目中。虽然这听起来像是一个非常小的优化,但避免反射很重要。如果你看到一些可以不考虑类型而使用结构的代码,它会使用反射并且会对性能产生影响。

例如,Logrus 并不关心类型,但显然 Go 需要知道(最终)。Logrus 怎么办呢?使用反射来检测类型,这是开销。

log.WithFields(log.Fields{<!--{C}%3C!%2D%2D%20%2D%2D%3E-->
“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 可能会警告你&ldquo;变量闭包捕获&rdquo;,但并不会要求你重新声明该变量。

Go 的性能名声很大程度上归功于执行的运行时优化,它尝试&ldquo;猜测&rdquo;你想要做什么并优化某些执行路径。在此期间,它&ldquo;捕获&rdquo;变量并以理论上最有效的方式将它们传递到需要它们的地方(例如,在完成一些非并发操作以释放某些 CPU 上的分配之后)。这种情况下的结果是循环可能会启动 goroutines,goroutines可能会在很晚之后从父作用域接收到 i 的值。不能保证在多次执行此代码时你会看到哪个,可能是数字10,也可以是其他数字。

如果你出于某种原因确实使用了闭包,一定要传递变量i,就像对待每个函数一样对待闭包。

来源:https://blog.csdn.net/Edu_enth/article/details/128490611

标签:go语言,高效编程
0
投稿

猜你喜欢

  • Python Selenium 之数据驱动测试的实现

    2021-12-16 22:45:27
  • Python实现人机中国象棋游戏

    2023-01-28 21:33:52
  • Vscode ChatGPT插件使用(无需代理注册)

    2023-05-13 18:25:01
  • python中判断数字是否为质数的实例讲解

    2022-02-17 13:19:05
  • Django与遗留的数据库整合的方法指南

    2024-01-15 02:20:32
  • Python基础之模块详解

    2023-02-24 23:23:52
  • css样式表滤镜全接触

    2007-10-26 12:48:00
  • Web 设计:实现干净代码的12条定律

    2008-12-04 13:27:00
  • MySQL Left JOIN时指定NULL列返回特定值详解

    2024-01-16 09:55:32
  • python中的tkinter库弹窗messagebox详解

    2023-11-12 04:02:05
  • Pygame实战练习之飞机大战游戏

    2021-01-13 13:11:25
  • mysql 8.0.22 安装配置图文教程

    2024-01-18 19:47:34
  • golang gorm错误处理事务以及日志用法示例

    2024-04-25 13:18:50
  • JavaScript解释型模版

    2009-10-19 23:12:00
  • 详解Python图像处理库Pillow常用使用方法

    2022-07-17 11:04:53
  • python 提取html文本的方法

    2021-05-27 03:43:46
  • 使用Python进行稳定可靠的文件操作详解

    2022-02-17 04:26:21
  • Python使用apscheduler模块设置定时任务的实现

    2021-05-01 05:01:54
  • go语言beego框架web开发语法笔记示例

    2024-05-21 10:25:22
  • Git的简单理解及基础操作命令详解

    2023-01-17 11:03:35
  • asp之家 网络编程 m.aspxhome.com