标识符的本质:每个标识符对应一个具有数据结构的值,但是这个值不方便直接访问,我们可以通过对其对应的标识符来访问数据,标识符就是一个指代。
命名规范
- 标识符采用CamelCase驼峰命名法
如果只在包内可用,就采用小驼峰命名
如果要在包外可见,就采用大驼峰命名
- 简单循环变量可以使用i、j、k、v等
- 条件变量、循环变量可以是单个字母或单个单词,Go倾向于使用单个字母。Go建议使用更短小
- 常量驼峰命名即可
在其他语言中,常量多使用全大写加下划线的命名方式,Go语言没有这个要求
对约定俗成的全大写,例如PI
- 函数/方法的参数、返回值应是单个单词或单个字母
- 函数可以是多个单词命名
- 类型可以是多个单词命名
- 方法由于调用时会绑定类型,所以可以考虑使用单个单词
- 包以小写单个单词命名,包名应该和导入路径的最后一段路径保持一致
- 接口优先采用单个单词命名,一般加er后缀。Go语言推荐尽量定义小接口,接口也可以组合
变量的可见性
1、包级标识符
在go语言中,在.go文件中的顶层代码中,定义的标识符成为包级标识符,如果首字符大写则包外可见,否则仅包内可见
// 定义无类型常量
var a = 20 //int
var b = 3.14 //float64
//延迟初始化需要指定类型,用零值先初始化,因为若不给出类型,无法判断是什么类型的零值
// 有相同关系的声明可以使用同一批定义
var (
name string
age int
)
使用建议:
- 顶层代码中定义的包级别标识符,遵循【首字符大写包外可见】
- const定义包级别常量,必须声明时初始化
- var定义包级别变量:可以指定类型,也可以使用无类型常量定义;延迟赋值必须指定类型
- 有相关关系的可以批量定义在一起
- 一般声明时考虑【就近原则】,尽量靠近第一次使用的地方声明
- 不能使用短格式定义
2、局部标识符
定义在函数中,main中。适用建议:
- 在函数中定义的标识符
- const定义局部常量
- var定义局部变量:可以指定类型,也可以使用无类型常量定义;延迟赋值必须指
- 有相关关系的可以批量定义在一起
- 在函数内,直接赋值的变量多用短格式定义
包名称
package dao
package service
文件名称
customer_dao.go
结构体命名
type CustomerOrder struct {
Name string
Address string
}
order := CustomerOrder{"tom", "北京海淀"}
接口命名
type Reader interface {
Read(p []byte) (n int, err error)
}
变量
- 包级别标识符不可以使用短格式,一般声明时,还是考虑“就近原则”,尽量靠近第一次使用的地方声明
- 在函数内的标识为局部标识符,多采用短格式定义,
var isExist bool
var hasConflict bool
var canManage bool
var allowGitHook bool
常量
type Scheme string
const (
HTTP Scheme = "http"
HTTPS Scheme = "https"
)
iota
iota是一个可被编译器修改的常量,它的默认开始值是0,每调用一次就加1,遇到const关键字就充值为0
const (
a = iota // 0
b // 1
c // 2
_ // 按道理是3,但是丢弃了
d // 4
e = 10 // 10
f // 10
g = iota // 7
h // 8
)
字面量
go语言中boolen rune integer float complex string都是字面常量。
100
0x6162 0x61_62_63
3.14
3.14e2
3.14E-2
'测'
'\u6d4b'
'\x31'
'1'
'\n'
"abc" "\x61b\x63"
"测试" "\u6d4b试"
"\n"
true
false
iota
//以上字面常量在Go中也被称为无类型常量untyped constant。无类型常量的缺省类型为bool、rune、
int、float64、complex128或字符串
零值
int为0
float为0.0
bool为false
string为空串""(注意是双引号)
指针类型为nil