这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
高质量编程
-
编程原则
- 简单性
- 可读性
- 生产力
-
如何编写高质量的Go代码
-
代码格式
-
注释
- 注释应该解释代码作用
- 注释应该解释代码是如何做的
- 注释应该解释代码实现的原因
- 注释应该解释代码什么情况下会出错
- 对暴露出的公共部分,进行说明
- 代码是最好的注释,注释应该提供代码未表达出的上下文信息
-
命名规范
-
简介胜于冗长
-
缩略词全大写,当其位于变量开头且不需要导出时,使用全小写
- ServeHTTP而不是ServeHttp
- 使用XMLHTTPRequest或着xmlHTTPRequest
-
变量距离其被使用的地方越远,则需要携带越多的上下文信息
-
全局变量在其名字中需要更多的上下文信息,使得在不同地方可以轻易辨认出其含义
-
函数名不携带包名的上下文信息,因为包名和函数名总是成对出现的
-
函数名尽量简短
-
-
控制流程
- 如果两个分支中都含有return,则可以省去冗余的else
- 优先处理错误情况或特殊情况,尽早返回或继续循环来减少嵌套
-
错误和异常处理
-
简单错误
- 优先使用errors.New来创建匿名变量来直接表示简单错误,
- 如果有格式化的需求,使用fmt.Errorf
-
错误的Wrap和Unwrap
- 错误的Wrap实际上提供了一个error嵌套另一个error的能力,从而生成一个error的跟踪链
-
errors.As
-
panic
-
recover
-
错误小结:error尽可能提供简明的上下文信息链,方便定位问题
- panic用于真正异常的情况
- recover生效范围,在当前goroutine的defer函数中生效
-
-
性能优化
- 性能优化的前提是满足正确可靠、简介清晰等质量因素
- 切片:尽可能在使用make()初始化切片是提供初始容量信息,
- map预分配内存
- 字符串拼接时+操作比strings.Builder耗时,strings.Builder比bytes.Buffer更快
- 空结构体不占用任何空间
- 多线程实现线程安全时推荐使用atomtic包,效率比锁高
普通应用代码,不要一味地追求程序性能
-
原则:
- 要依靠数据不是猜测
- 要定位最大瓶颈而不是细枝末节
- 不要过早优化
- 不要过度优化
-
性能调优工具:pprof