这是我参与「第五届青训营」伴学笔记创作活动的第 3 天
第三天
高质量编程简介及编码规范
高质量编程
公共符号始终要注释
推荐使用
gofmt自动化格式代码 或者goimports=gofmt+ 依赖包管理
命名规范
变量
- 简洁
- 缩略词全大写
- 变量距离其背使用的地方越远,则需要携带越多的上下文信息
函数
- 函数名尽量简短
包
- 只由小写字母组成
- 简短并包含一定的上下文信息
- 使用单数而不是复数
控制流程
优先处理错误情况/特殊情况,尽早返回或继续循环来减少嵌套
错误和异常处理
简单的错误
- 简单的错误指的是仅出现一次的错误,在其他地方不需要捕获该错误
- 优先使用
errors.New来创建匿名变量来直接表示简单错误
复杂的错误
Panic不建议使用,表明程序崩溃不可用recover只能在被defer的函数中使用,嵌套无法生效,只在当前goroutine生效 ,defer的语句是后进先出
性能优化指南
性能表现需要实际数据衡量,Go语言提供了支持基准性能测试的 benchmark工具
go test -bench=. -benchmem
Slice预分配内存
- 尽可能使用
make()初始化切片时提供容量信息
-
切片本质是一个数组片段的描述
- 包括数组指针
- 片段的长度
- 片段的容量
-
切片操作并不复制切片指向的元素
-
创建一个新的切片会复用原来切片的底层数组
扩容过程
map预计分配内存
字符串
常见的字符串拼接方式
- 使用 + 号 拼接性能最差,
strings.Builderbytes.Buffer相近,strings.Buffer更快
使用空结构体节省内存
- 空结构体
struct{}实例不占据任何的内存空间
多线程使用atomic包
小结
- 避免常见的性能陷阱可以保证大部分程序的性能
- 普通应用代码,不要一味地追求程序的性能
- 越高级的性能优化手段越容易出现问题
- 在满足正确可靠、简洁清晰的质量要求的前提下提高程序性能
性能调优实战
性能分析工具 pprof
- 可以知道应用在什么地方耗费了多少CPU、Memory
- pprof是用于可视化和分析性能分析数据的工具
功能简介
CPU
堆内存
协程
锁
阻塞