这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天
一、目录
本节课主要分为四个部分:
1.Go 语言编码规范
2.Go 语言性能优化建议
3.性能分析工具pprof的使用
4.性能调优实际案例
这里主要介绍前两个部分。
二、Go 语言编码规范
编程原则:简单性(消除复杂性)、可读性(编写可维护代码的第一步是确保代码可读)、生产力(团队整体工作效率非常重要)。
编程规范:
1.代码格式
gofmt:Go 语言官方提供的工具,能自动格式化Go 语言代码为官方统一风格,常见IDE都支持方便的配置。
goimports:Go 语言官方提供的工具,实际等于gofmt加上依赖包管理,自动增删依赖的包引用、将依赖包按字母序排序并分类。
2.注释
注释应该做什么?
1.注释应该解释代码作用。
2.注释应该解释代码如何做的。
3.注释应该解释代码实现的原因。
4.注释应该解释代码什么情况会出错。
公共符号始终要注释。
代码是最好的注释,注释应该提供代码未表达出的上下文信息。
3.命名规范
1.简洁胜于冗长。
2.缩略词全大写。
3.变量距离其被使用的地方越远,则需要携带越多的上下文信息。
4.控制流程
1.避免嵌套,保持正常流程清晰。
2.尽量保持正常代码路径为最小缩进。
5.错误和异常处理
1.简单错误(仅出现一次的错误,且在其他地方不需要捕获该错误):优先使用errors.New来创建匿名变量来直接表示简单错误;如果有格式化的需求使用fmt.Errorf。
2.错误的Wrap和Unwrap:Wrap提供了一个error嵌套另一个error的能力,从而生成一个error的跟踪链。
3.错误判定:判定一个错误是否为特定错误,使用errors.Is;在错误链上获取特定种类的错误,使用errors.As。
4.panic:不建议在业务代码中使用panic,调用函数不包含recover会造成程序崩溃,若问题可以被屏蔽或解决,则建议使用error代替panic。
三、Go 语言性能优化建议
1.Benchmark
Go 语言提供的支持基准性能测试的benchmark工具。
2.slice
预分配内存:尽可能在使用make()初始化切片时提供容量信息。
3.map
预分配内存:尽可能在使用make()初始化map时提供容量信息。
4.字符串拼接
使用strings.Builder和bytes.Buffer。
5.空结构体
使用空结构体节省内存。
6.atomic包
效率比直接加锁高。