这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天
1 编码规范
1.1 格式化规范
gofmt:GO语言官方提供的工具,能自动格式化Go语言代码为官方统一风格,常见的IDE都支持方便的配置
goimport:这个在gofmt的基础上增加了自动删除和引入包,功能更加完善。
1.2 行长约定
一行最长不超过80个字符,超过的请使用换行展示,尽量保持格式优雅。
1.3 package名字
保持package的名字和目录保持一致,尽量采取有意义的包名,简短,有意义,尽量和标准库不要冲突。
1.4 import 规范
import在多行的情况下,goimports会自动帮你格式化,但是我们这里还是规范一下import的一些规范,如果你在一个文件里面引入了一个package,还是建议采用如下格式:
import (
"fmt"
)
1.5 变量申明
变量名采用驼峰标准,不要使用_来命名变量名,多个变量声明放在一起
var (
Found bool
count int
)
在函数外部申明必须使用var,不要采用:=,容易踩到变量的作用域的问题。
1.6 错误处理
错误处理的原则就是不能丢弃任何有返回err的调用,不要采用_丢弃,必须全部处理。接收到错误,要么返回err,要么实在不行就panic,或者使用log记录下来
1.7 闭包的调用
在循环中调用函数或者goroutine方法,一定要采用显示的变量调用,不要再闭包函数里面调用循环的参数
fori:=0;i<limit;i++{
go func(){ DoSomething(i) }() //错误的做法
go func(i int){ DoSomething(i) }(i)//正确的做法
}
1.8 注释
1、所有导出对象都需要注释说明其用途;非导出对象根据情况进行注释。
2、如果对象可数且无明确指定数量的情况下,一律使用单数形式和一般进行时描述;否则使用复数形式。
3、包、函数、方法和类型的注释说明都是一个完整的句子。
4、句子类型的注释首字母均需大写;短语类型的注释首字母需小写。
5、注释的单行长度不能超过80个字符。
2 性能优化
2.1 简介
- 性能优化的前提是在满足正确性、可靠性、健壮性、可读性等质量因素
- 性能优化是综合评估,有时候时间效率和空间效率可能对立
- 针对 Go 语言特性,介绍 Go相关的性能优化建议
2.2 Benchmark
- 性能表现需要实际数据衡量
- Go 语言提供了支持基准性能测试的 benchmark 工具
进入当前目录执行: go test -bench=. -benchmem
参数对应分别为:
- BenchmarkFib10是测试函数名,-8表示GOMAXPROCS的值为8
- 表示一共执行4866588次,即b.N的值
- 每次执行花费249.1ns
GOMAXPROCS1.5版本后,默认为CPU核数
2.3 Slice
在使用 slice 时,如果知道切片的容量与大小,可以进行赋值操作,相比 append 减少返回新的切片。
-
切片本质是一个数组片段的描述
- 包括数组指针
- 片段的长度
- 片段的容量(不改变内存分配情况下的最大长度)
-
切片操作并不复制切片指向的元素
-
创建一个新的切片会复用原来切片的底层数组
2.4 Map
- 不断向 map 中添加元素的操作会触发 map 的扩容
- 提前分配好空间可以减少内存拷贝和Rehash的消耗
- 建议根据实际需求提前预估好需要的空间
2.5 字符串
使用 + 拼接性能最差,strings.Builder, bytes.Buffer相近,strings.Buffer 更快
字符串在Go语言中是不可变类型,占用内存是固定的。因此使用 + 每次都会重新分配内存。而strings.Builder, bytes.Buffer 底层都是 []byte 数组,其内容扩容策略,不需要每次拼接重新分配内存。bytes.Buffer 转化为字符串时重新申请了一块空间,strings.Builder 直接将底层的 []byte 转换成了字符串返回类型。
2.6 空结构体
-
空结构体 struct{} 实例不占据任何的内存空间
-
可作为各种场景下的占位符使用
- 节省资源
- 空结构体本身具备很强的语义,即这里不需要任何值,仅作为占位符
3 pprof
pprof是GoLang程序性能分析工具,prof是profile(画像)的缩写,用pprof我们可以分析下面常见的4种数据
- CPU Profiling:CPU 分析,按照一定的频率采集所监听的应用程序 CPU(含寄存器)的使用情况,可确定应用程序在主动消耗 CPU 周期时花费时间的位置
- Memory Profiling:内存分析,在应用程序进行堆分配时记录堆栈跟踪,用于监视当前和历史内存使用情况,以及检查内存泄漏
- Block Profiling:阻塞分析,记录 goroutine 阻塞等待同步(包括定时器通道)的位置
- Mutex Profiling:互斥锁分析,报告互斥锁的竞争情况