命名规范
包名
保持package的名字和目录保持一致,尽量采取有意义的简短的包名,与标准库不要冲突。包名为小写单词,不要使用下划线或者混合大小写
package model
package main
文件名
尽量采取有意义的文件名,简短,有意义,应该为小写单词,使用下划线分隔各个单词。
sql_user.go
结构体命名
采用驼峰命名法,首字母根据访问控制大写或者小写
struct申明和初始化格式采用多行,例如下面:
// 多行申明
type User struct{
Name string
Age string
}
// 多行初始化
user := User{
Name:"小明",
Age:"17"
}
接口命名
命名规则类似于结构体命名
单个函数的结构体名以 “er” 作为后缀,例如 Reader, Writer
type Reader interface{
Read(p []byte)(n int,err error)
}
变量命名
命名规则类似于结构体命名
但遇到特有名词,就需要遵循以下原则:
- 如果变量为私有,且特有名词为首个单词,则使用小写,如apiClient
- 其它情况应使用该单词原有写法,如APIClient、repoID、UserID
- 错误示例:UrlArray, 应该写成 urlArray 或者 URLArray
- 若变量类型为bool类型,则需要以 Has, Is, Can或者Allow开头
var isExist bool
var hasConflict bool
var canManage bool
var allowGitHook bool
常量命名
常量命名均使用全部大写字母组成,并使用下划线分词
const APP_VERSION = "1.0"
如果是枚举类型的常量,需要先创建相应类型
type Str string
const(
HTTP Str = "http"
HTTPS Scheme = "https"
)
注释
包注释
每一个包都应该有一个包注释,一个位于package子句之前的块注释或者行注释。包如果有多个go文件,只需要出现在一个go文件中(一般是和包同名的文件)即可。包应该包含下面基本信息(顺序:简介,创建人,创建时间)
- 包的基本简介(包名,简介)
- 创建者,格式:创建人:rtx名
- 创建时间,格式:创建时间:yyyMMdd
/*
util 包,该包包含了项目共用的一些常量,封装了项目中的一些共用函数。
创建人:xiaoming
创建时间:20200419
*/
接口(结构)注释
对结构体进行简要的介绍,格式为:结构体名,结构体说明。同时结构体内的每个成员变量都要有说明,该说明放在成员变量的后面
// User 用户对象,定义了用户的基础信息
type User struct{
Name stirng // 用户名
Email string // 邮箱
}
函数(方法)注释
函数的注释包括三个方面(按照顺序)
- 简要说明,格式说明:以函数名开头,“,”分隔说明部分
- 参数类别:每行一个参数,参数名开头,“,”分隔说明部分
- 返回值:每行一个返回值
// NewUser ,新增一个对象
// 参数:
// name 用户名
// age 年龄
// 返回值:
// 一个 User 对象
func NewUser(name string,age int) *User{
}
代码逻辑注释
单行注释,统一中文注释,中英文之间空格分隔,单词与中文标点之间也要使用空格分隔,例如:
// 从 mysql 中读取数据, 对于读取到的 id , 记录到一个数组里面
Import 规范
三类包:
- go 自带包
- github.com的包
- 自己写的包
import(
"encoding/json"
"github.com/go-sql-driver/mysql"
"myproject/utils"
)
每类包用空行分隔,顺序分别为go自带的包,github的包,自己写的包
错误处理
- 不能丢弃任何有返回err的调用,不要使用_丢弃,必须全部处理,要么返回,要么用log记录下来
- 尽早用return,一旦有错误,马上返回
- 尽量不要使用panic,除非知道在做什么
- 错误描述如果是英文,必须小写,不需要标点结尾
- 采用独立的错误流进行处理
// 错误写法
if err != nil{
// error handling
}else{
// normal code
}
// 正确写法
if err != nil{
return err
}