1 命名规范
1.1 Go是一门区分大小写的语言。
命名规则涉及变量、常量、全局函数、结构、接口、方法等的命名。 Go语言从语法层面进行了以下限定:任何需要对外暴露的名字必须以大写字母开头,不需要对外暴露的则应该以小写字母开头。
当命名(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,如:Analysize,那么使用这种形式的标识符的对象就可以被外部包的代码所使用(客户端程序需要先导入这个包),这被称为导出(像面向对象语言中的 public);
命名如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的(像面向对象语言中的 private )
而Go 语言中,任何标识符(变量,常量,函数,自定义类型等)都应该满足以下规律:
- 连续的字符或数字组成。
- 以字符或下划线开头。
- 不能和 Go 关键字冲突。
go有如下关键字
break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var
1.2 包名称
保持package的名字和目录保持一致,尽量采取有意义的包名,简短,有意义,尽量和标准库不要冲突。包名应该为小写单词,不要使用下划线或者混合大小写。
1.3 文件命名
尽量采取有意义的文件名,简短,有意义,应该为小写单词,使用下划线分隔各个单词。
1.4 结构体命名
采用驼峰命名法,首字母根据访问控制大写或者小写
struct 申明和初始化格式采用多行,例如下面:
type MainConfig struct {Port string `json:"port"`Address string `json:"address"`
}
1.5 常量命名
常量均需使用全部大写字母组成,并使用下划线分词
const APP_URL = "https://www.baidu.com"
如果是枚举类型的常量,需要先创建相应类型:
type Scheme stringconst (HTTP Scheme = "http"HTTPS Scheme = "https"
)
1.6 变量命名
和结构体类似,变量名称一般遵循驼峰法,首字母根据访问控制原则大写或者小写,但遇到特有名词时,需要遵循以下规则:
如果变量为私有,且特有名词为首个单词,则使用小写,如 appService
若变量类型为 bool 类型,则名称应以 Has, Is, Can 或 Allow 开头
var isExist bool
var hasConflict bool
var canManage bool
var allowGitHook bool
2. 错误处理
错误处理的原则就是不能丢弃任何有返回err的调用,不要使用 _ 丢弃,必须全部处理。接收到错误,要么返回err,或者使用log记录下来
- 尽早return:一旦有错误发生,马上返回
- 尽量不要使用panic,除非你知道你在做什么
- 错误描述如果是英文必须为小写,不需要标点结尾
- 采用独立的错误流进行处理
// 错误写法
if err != nil {// error handling
} else {// normal code
}// 正确写法
if err != nil {// error handlingreturn // or continue, etc.
}
// normal code
3. 单元测试
单元测试文件名命名规范为 example_test.go 测试用例的函数名称必须以 Test 开头,例如:TestExample 每个重要的函数都要首先编写测试用例,测试用例和正规代码一起提交方便进行回归测试 。
4. 常量
相对于变量而言,常量是在程序使用过程中,不会改变的数据。有些地方你需要将定义好的常量重复使用,代码中你不允许它的值改变。例如 圆周率 在程序执行过程中不会改变。
常量只能在其声明的范围内使用,如果在一个函数内部作用域中声明的常量与外部名称相同, 则只用自己内部的常量, 它将忽略外部的常量。
4.1 总结
- 常量数值不能修改。
- 常量定义后可以不使用。
- 常量定义不能使用简短定义方式。
- 常量中使用的数据类型只能是 整型、布尔、浮点、复数类型、字符串类型。
5. iota特殊的常量
iota是常量里面的计数器,初始值默认值是0,可以被编译器自动修改,每定义一组常量时,iota逐行自增1。
因为go中没有像Java那样的枚举类型,因此我们可以通过iota来实现枚举类型
const (Spring Mytype = iotaSummerAutumnWinter
)