开发工具: GoLand
官方代码规范: https://golang.org/doc/effective_go.html
1. 工具
提交代码前需使用 fmt 工具格式化
提交代码前需使用 vet 工具进行静态检查
2. 目录规范
- |- bin
- |- build
- |-build_dev/test/release.sh
- |- gen-go
- |- config
- |- dev/test/release.YAML
- |- pkg
- |-controller
- |-dao
- |-rpc
- |-service
- |-*_impl.go
- |-*_test.go
- |-*_mock.go
- |- vendor
- |- README.md
3. 命名规范
文件
小写 + 下划线
包命名
package 名和目录保持一致, 需避免和标准库冲突
避免 import 相对路径
方法 / 接口
采用驼峰命名法
非对外方法, 首字母需为小写
变量
采用驼峰命名法
常量
大写 + 下划线
4. 注释
可以通过 /* ...... */ 或者 // ...... 增加注释, // 之后应该加一个空格
注释内容需要在文件 / 方法 / 变量上方
5. 异常
需要对异常做判断处理
不要将 error 赋值给匿名变量_
6. 其他
不允许逻辑中调用 Panic, 选择日志的 log.Fatal
不要频繁的调用 defer
尽早 return, 一旦有错误发生, 马上返回
if 接受初始化语句, 约定如下方式建立局部变量
- if err := file.Chmod(0664); err != nil {
- return err
}
方法的接收器的名称 一般采用 strcut 的第一个字母且为小写, 而不是 this,me 或者 self
- type rpcClient struct {
- once sync.Once
- }
- func (r *rpcClient) newCodec(contentType string) (codec.NewCodec, error) {
- //
- }
对于 bool 类型的变量 var b bool, 直接使用它作为判断条件, 而不是使用它和 true/false 进行比较
byte/string slice 相等性比较, 使用 Equal
当接受者是 map, chan, func, 不要使用指针传递, 因为它们本身就是引用类型
当接受者是 slice, 而函数内部不会对 slice 进行切片或者重新分配空间, 不要使用指针传递
当函数内部需要修改接受者, 必须使用指针传递
当接受者是一个结构体, 并且包含了 sync.Mutex 或者类似的用于同步的成员. 必须使用指针传递, 避免成员拷贝
当接受者类型是一个结构体并且很庞大, 或者是一个大数组, 建议使用指针传递来提高性能, 其他场景使用值传递即可
来源: https://juejin.im/post/5c16f16c5188252dcb30ff42