青训营笔记|高质量编程和性能调优
高质量编程
如何编写高质量的Go 代码
代码格式
使用gofmt自动格式化代码(在 goland 中可以设置)
注释
- 解释代码作用
- 解释代码过程
- 解释代码实现原因
- 解释代码的限制条件、什么情况下会出现错误
- 公共符号要进行注释,但接口不用注释实现
命名规范
- 简洁
- 缩略词全大写,但处于变量开头全小写
- 使用的距离越远,应携带更多的上下文内容
- 核心目标降低阅读理解代码的成本
控制流程
- 去除冗余
- 最小缩进
错误和异常处理
- 简单错误不用捕捉
- 错误判定使用error.ls
- 在错误链上获取特定的种类错误使用error.As
- 在业务代码中不是用 panic
- recover的生效范围只在当前 goroutine中的 defer生效
性能优化
Benchmark
go test -bench=. -benchmen
slice预分配内存
- 尽可能在make()初始化切片时提供容量信息
- 使用 copy替代re-slice
map 预分配内存
- 尽可能在 make()初始化 map 时提供容量信息
字符串处理
- 使用strings.Builder进行字符串的拼接操作
空结构体
- 使用空结构体节省内存
atomic 包的使用
- 使用锁时效率高
性能分析工具
分析工具pprof
首先搭建pprof实践项目
package DbService
import (
"log"
"net/http"
_ "net/http/pprof"
"os"
"runtime"
)
func main() {
log.SetFlags(log.Lshortfile | log.LstdFlags)
log.SetOutput(os.Stdout)
runtime.GOMAXPROCS(1)
runtime.SetMutexProfileFraction(1)
runtime.SetBlockProfileRate(1)
go func() {
if err := http.ListenAndServe(":6060", nil); err != nil {
log.Fatal(err)
}
os.Exit(0)
}()
}
浏览器输入localhost:6060/debug/pprof/进行查看指标
go tool pprof "http://localhost:6060/debug/pprof/profile?seconds=10"
调用topN 命令查看占用资源最多的函数
调用 List 命令查看代码行
调用 web 命令使关系可视化
使用下一命令查看 heap 堆内存
go tool pprof "http://localhost:6060/debug/pprof/heap"
使用以下命令查看协程的占用
go tool pprof "http://localhost:6060/debug/pprof/goroutine"
通过以下命令查看锁的详细
go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/mutex"
通过以下命令查看阻塞的详细
go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/block"