这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天
编码规范
1、代码格式
推荐使用 gofmt 自动化格式化代码
2、注释
- 注释应该怎么做:① 解释代码 ② 解释代码如何做的 ③ 解释代码实现的原因 ④ 解释代码什么情况会出错
3、命名规范
- 变量
- 函数
- 包
4、控制流程
- 避免嵌套,保证正常流程清晰
- 尽量保持正常代码路径为最小缩进
5、错误和异常处理
- 简单错误
- 仅出现一次的错误
- 使用
errors.New("[要输出的信息]") - 如果需要格式化,用
fmt.Errof
- 错误的 Wrap 和 Unwrap
- 提供了一个 error 嵌套另一个 error 的能力,从而生成一个 error 的跟踪链
- 在
fmt.Errorf()中使用%w关键字来将一个错误关联至错误链中
- 错误判断
errors.Is():判断是否为特定错误==:判断错误链上的错误是否含有特定错误errors.As():在错误链上获取特定种类的错误
- panic:当程序启动阶段发生不可逆的错误时,可以在 init 或 main 函数中使用 panic
- recover
- 只能在被 defer 的函数中使用
- 嵌套无法生效
- 只能在 goroutine
- defer 的语句是后进后出
- 在 recover 后加 log:记录当前的调用栈(得到上下文信息)
性能优化
- Benchmark
go test -bench=. -benchmem - slice
- 预分配内存,在使用 make() 初始化切片时提供容量信息
- 用 copy 替代 re-slice
- 预分配内存,在使用 make() 初始化切片时提供容量信息
- map
- map 预分配内存
- 分析:
- 不断向 map 中添加元素操作会触发 map 操作
- 提前分配好空间可以减少内存靠别和 Rehash 的消耗
- 提前预估需要的空间
- map 预分配内存
- 字符串处理
- strings.Builder
- 性能比较:strings.Builder > bytes.Buffer > +
- 预分配内存
- strings.Builder
- 空结构体
- 不占用任何空间
- 可作为占位符
- 实现 set 可以考虑用 map 来代替
- atomic
pprof
golang pprof 实战 | Wolfogre's Blog
gitib项目:wolfogre/go-pprof-practice: go pprof practice. (github.com)
参考:golang pprof 实战 | Wolfogre's Blog
- 使用
- 终端运行程序
go run main.go - 进行排场
go tool pprof http://localhost:6060/debug/pprof/profile - 输入
top
- 终端运行程序
- 参数说明
Flat == Cum,函数中没有调用其他函数
Flat == 0.函数中只有其他函数的调用 - pprof 总结
啊啊啊啊啊啊啊听不懂"quq"