高质量编程
高质量:
- 正确性:边界清晰、正确处理一些边界情况
- 可靠性:鲁棒
- 简洁清晰
编码规范
众所周知,Go 是强迫症语言,所以能编译出来的代码基本都是格式化好了,因此 Google 的 Style Guide 里面并没有 Go 语言的 styleguide;
但是依然有的是关于编码大致模式和高效编程的一些指导,参考:styleguide | Style guides for Google-originated open-source projects (这个很简洁,几分钟就能读完)
中文版:Google Go 编程规范 | Google Style Guides
下面是一些比较重要的公共约定部分:
注释
- 公共符号始终要注释
- 不需要注释借口的实现方法
要求:
- 解释代码未表达出的上下文
- 解释代码何时会出错
代码格式
使用本地工具
命名规范
变量
- 越短越好
- 缩略词全大写
- 变量调用的位置越远,就要携带更尽可能多的上下文信息
函数
- 不必携带包名的content
- 短
- foo(这个变量一般用来表示一个未知的值,表示尚未确定,也是一种 placeholder)
包
控制流程
避免嵌套,尽量减少缩进
实例:检测多个函数的错误的时候,有错误就提前返回
错误和异常处理
简单错误
warp
包装错误形成错误链
错误判定
- 不能用
==来判断错误,error.Is可以用来检查错误链上是否有特定错误 error.As可以将特定错误获取出来,和.Is的区别是能够拿出来判断
error
提供尽可能简明的错误
panic
用于真正异常的情况
听不懂
recover
- 是在被
defer的函数中使用的 - 多个
defer后进先出 - 可以配合
log记录当前调用栈
性能优化建议
获取建议:Benchmark
go test -bench=. -benchmem- 结果说明
具体的建议:
- slice 预分配内存
原理:本质是对数据进行的指针、分配内存的操作
另一个建议是再创建子切片的时候使用 copy,让大内存尽量得到释放