Go语言高质量编程与性能调优 | 青训营笔记

60 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天

前言

过完年,摸了几天🐟,今天参考教案、视频,回顾一下前几天学习的内容

高质量编程

编程原则

    简单性,可读性,生产力

格式化代码

    gofmtgoimports 在Goland的go工具 -> tool里面

    Ctrl+Alt+L 可以快速缩进 这两个大部分效果差不多。。

代码注释

    需要提供-外部因素,上下文,限制条件

    公共符号要注释,但不需要注释实现接口的方法

    解释代码什么情况会出错

    命名上缩略词全大写但是位于开头不需要,并且要考虑上下文信息

  • 使用ServeHTTP而不是ServeHttp
  • 使用XMLHTTPRequest而不是xmlHTTPRequest

控制流程

    尽早返回,最少嵌套

错误及异常处理

    优先使用 errors.New 来创建匿名变量,如果有格式化需求,使用 fmt,Errof

    在 fmt.Errorf 中使用 %w 将一个错误关联至错误链中

    recover() 函数可以让进入宕机 (panic) 流程中的 goroutine 恢复过来,recover 仅在延迟函数 defer 中有效,捕获当前panic就不会向上传递。在正常的执行过程中,调用 recover 会返回 nil 并且没有其他任何效果

    defer 后进先出

性能调优

Slice

尽可能在使用make初始化切片时提供容量信息,减少内存分配次数。另一个是Slice可能会出现大内存未释放的情况(原切片较大,代码在原切片 基础上新建小切片。原底层数组在内存中有引用,得不到释放),解决的办法是可以使用copy替代re-slice重切片。

Map

类似Slice,尽可能地在make时为Map提供容量信息,减少内存拷贝和重哈希的消耗。

字符串

用string.Builder处理速度最快

  • 使用‘+’号进行字符串拼接性能最差,strings.Builder,bytes.Buffer相近,strings.Buffer更快

空结构体

  • 空结构体struct{}的实例不占内存空间。其中不含有任何数据,那有什么意义呢?我们常把它作为占位符使用

atomic

用atomic包的时间性能比加锁更好

  • 锁的实现是通过操作系统来实现,属于系统调用,占用资源多。
  • atomic操作是通过硬件实现,效率比锁高

image.png

还有性能分析工具 pprof ,还有go语言自带Benchmark

课后个人总结

本节课项目难度相较于三件套来说更加容易接受一点,但还是有很多知识点需要进一步吸收消化。