这是我参与「第五届青训营 」伴学笔记创作活动的第3天
一、本堂课重点内容:
- 高质量编程及代码规范
- 性能优化指南
- 性能优化分析工具
- 性能调优实战案例
二、详细知识点介绍:
高质量编程及代码规范
gofmt
goland官方推荐的代码格式化工具
注释
- 注释应解释代码作用
- 注释应该解释代码如何做的
- 注释应该解释代码实现的原因
- 注释应该解释代码什么情况会出错
- 可以不注释实现接口的方法的作用
命名规范
- 简洁胜于
控制流程
- 避免嵌套,容易出现内存陷阱
- 优先处理错误情况/特殊情况,减少嵌套次数
错误处理
简单的错误
特指仅出现一次的错误,可以用erros.New("")来创建匿名变量来表示,如有格式化需求,使用fmt.Error
return errors.New("This is a errors")
错误链
用fmt.Errorf的%w来将一个错误关联到一个错误链中
err := errors.New("This is a errors A")
return fmt.Errorf("This is a errors list : %w", err)
注:==无法判断错误链上的错误是否为特定错误,应使用erros.Is() 对于某种特定的错误,可以使用erros.As()来获取
性能优化指南
Benchmark
go test -bench=, -benchmem
slice内存预分配
- 在make()创建切片时指定内存大小
data := make([]int,o,10) - slice大内存未释放 用copy代替re-slice
map内存预分配
字符串处理
使用strings.Builder将底层的[]byte转换成字符串类型返回
空结构体技巧
- 空结构体struct{}实例不占据任何空间,可以作为某些情况下的占位符使用
atomic包
atomic包实现多线程公有计数器,性能比加锁的要好
使用注意:
- sync.Mutex应该用于保护一段逻辑,而非变量
- 对于非数值操作,可以使用atomic.Value,能承载一个interface{}
性能分析工具-pprof
可视化和分析性能的工具
| 命令 | 作用 |
|---|---|
| topN | 查看占用资源最多的函数 |
| list | 根据指定的正则表达式查找代码行 |
| web | 调用关系可视化 |
| --- | --- |
总结
- 性能调优原则:要靠数据而不是猜
三、课后个人总结:
- 本章有什么知识点不容易掌握?
- 什么地方容易与其他内容混淆?
- 学习了代码规范和性能调优方面的技巧,还有性能调优工具pprof的使用和实践