Go 语言代码规范
代码风格
大部分格式问题都可以通过 gofmt 解决,gofmt 自动格式化代码,保证所有的go代码与官方推荐的格式保持一致,于是所有格式有关问题,都以gofmt的结果为准。 不同的编辑器有不同的配置, sublime的配置教程:http://michaelwhatcott.com/gosublime-goimports/
- LiteIDE默认已经支持了goimports,如果你的不支持请点击属性配置->golangfmt→勾选goimports保存之前自动fmt你的代码
- 使用 vim 开发请安装插件:https://github.com/fatih/vim-go 或者 coc.nvim + gopls
- 使用 vscode 开发请直接安装里面的 Go 插件:https://github.com/golang/vscode-go
命名规则
Go语言程序员推荐使用 驼峰式 命名,当名字有几个单词组成的时优先使用大小写分隔,而不是优先用下划线分隔。 因此,在标准库有 QuoteRuneToASCII 和 parseRequestLine 这样的函数命名,但是一般不会用 quote_rune_to_ASCII 和 parse_request_line 这样的命名。 而像ASCII和HTML这样的缩略词则避免使用大小写混合的写法,它们可能被称为htmlEscape、HTMLEscape或escapeHTML,但不会是escapeHtml。
文件名
以kerbab命名法命名,比如:foo_bar.go
包名 (package)
包名与包所在的目录名一致并小写
结构体 (Struct)
优先以 S 开头,私有struct名以小写 s 开头 遵循CamelCase(驼峰)命名法,由有意义的名词组合而成
接口 (Interface)
遵循CamelCase(驼峰)命名法 优先以 I 开头,私有interface名以小写 i 开头 , 比如:IModelManager
函数或方法
- 遵循CamelCase(驼峰)命名法,由有意义的英文单词拼接而成
- 若函数或方法为判断类型(返回值主要为 bool 类型),则名称应以 Has, Is, Can 或 Allow 等判断性动词开头:
func HasPrefix(name string, prefixes []string) bool { ... }
func IsEntry(name string, entries []string) bool { ... }
func CanManage(name string) bool { ... }
func AllowGitHook() bool { ... }
- 必须以动词开头,如Get/Set/Make/Upload等,从名字能看出该方法实现的功能
常量
- 常量均需使用全部大写字母组成,并使用下划线分词:
const APP_VER = "0.7.0.1110 Beta"
- 如果是枚举类型的常量,需要先创建相应类型,并且以大写 T(公共类型) 或小写 t(私有类型) 开头:
type TScheme string
const (
HTTP TScheme = "http"
HTTPS TScheme = "https"
)
- 如果模块的功能较为复杂、常量名称容易混淆的情况下,为了更好地区分枚举类型,可以使用完整的前缀:
type TPullRequestStatus int
const (
PULL_REQUEST_STATUS_CONFLICT TPullRequestStatus = iota
PULL_REQUEST_STATUS_CHECKING
PULL_REQUEST_STATUS_MERGEABLE
)
变量
变量命名
- 遵循CamelCase(驼峰)命名法,由有意义的英文单词拼接而成
- 必须为名词,变量命名基本上遵循相应的英文表达或简写
- 在相对简单的环境(对象数量少、针对性强)中,可以将一些名称由完整单词简写为单个字母,例如:
- user 可以简写为 u
- userID 可以简写 uid
- 若变量类型为 bool 类型,则名称应以 Has, Is, Enable, Can 或 Allow 开头:
var isExist bool
var hasConflict bool
var canManage bool
var allowGitHook bool
- 上条规则也适用于结构定义:
// Webhook represents a web hook object.
type Webhook struct {
Id int64 `xorm:"pk autoincr"`
RepoID int64
OrgID int64
Url string `xorm:"url TEXT"`
ContentType HookContentType
Secret string `xorm:"TEXT"`
Events string `xorm:"TEXT"`
*HookEvent `xorm:"-"`
IsSSL bool `xorm:"is_ssl"`
IsActive bool
HookTaskType HookTaskType
Meta string `xorm:"TEXT"` // store hook-specific attributes
LastStatus HookStatus // Last delivery status
Created time.Time `xorm:"CREATED"`
Updated time.Time `xorm:"UPDATED"`
}
string变量
类似Java的String,golang中的string为immutable变量,通过concat构造string时,请用bytes.Buffer或者strings.Builder
var buf bytes.Buffer
buf.WriteByte('a')
buf.WriteString("b")
return buf.String()