[ 高质量编程与性能调优 | 青训营笔记 ]
这是我参与「第五届青训营」伴学笔记创作活动的第 3 天
零、前言:
记个笔记顺便(恰青豆还是有很多不完善也有可能对的地方还请大佬们指正
一、本堂课重点内容:
-
高质量编程
- 编程原则
- 编码规范
- 注释及命名
- 控制流程
- 错误及异常处理
-
性能调优实战
- 调优结构
- pprof
二、详细知识点介绍:
3.1 编程原则
简单性,可读性,生产力
3.2 格式化代码
gofmt 和 goimports 在Goland的go工具 -> tool里面
Ctrl+Alt+L 可以快速缩进 这两个大部分效果差不多。。
3.3 代码注释
需要提供-外部因素,上下文,限制条件
公共符号要注释,但不需要注释实现接口的方法
解释代码什么情况会出错
命名上缩略词全大写但是位于开头不需要,并且要考虑上下文信息
- 使用
ServeHTTP而不是ServeHttp - 使用
XMLHTTPRequest而不是xmlHTTPRequest
3.4 控制流程
尽早返回,最少嵌套
3.5 错误及异常处理
优先使用 errors.New 来创建匿名变量,如果有格式化需求,使用 fmt,Errof
在 fmt.Errorf 中使用 %w 将一个错误关联至错误链中
recover() 函数可以让进入宕机 (panic) 流程中的 goroutine 恢复过来,recover 仅在延迟函数 defer 中有效,捕获当前panic就不会向上传递。在正常的执行过程中,调用 recover 会返回 nil 并且没有其他任何效果
defer 后进先出
3.6 结构调优
go test -besh=. -benchmem #基准性能测试
对于 slice map 尽可能预先分配内存
使用 atomic 包来优化锁
3.7 pprof
pprof GitHub - google/pprof: pprof is a tool for visualization and analysis of profiling data
实战 GitHub - wolfogre/go-pprof-practice: go pprof practice.
采样数据
- allocs:内存分配情况
- blocks:阻塞操作情况
- cmdline:程序启动命令及
- goroutine:当前所有goroutine的堆栈信息
- heap:堆上内存使用情况(同alloc)
- mutex:锁竞争操作情况
- profile: CPU占用情况
- threadcreate:当前所有创建的系统线程的堆栈信息
- trace:程序运行跟踪信息
terminal中输入命令go tool pprof + <采样链接>来启动采样
例如:go tool pprof -http=:8083"http://localhost:6060/debug/pprof/profile?seconds=10"
三、总结:
学习了代码规范,回头还是要亲手试一试pprof