名字很重要
起名要有可读性, 好变量名的特点是
- 一致 (容易猜测)
- 简短 (易于输出)
- 准备 (易于理解)
通常来说,如果一个名字的作用域比较大,生命周期也比较长,那么用长的名字将会更有意义。但是局部变量还是参考以上三点
1. 项目目录名
使用中划线组合
2. 包名
- 使用
bytes.Buffer
and strings.Reader
,而没有 bytes.ByteBuffer
and strings.StringReader
- 导出的软件包名要有意义, 避免 util ,common 等
- 避免使用大写字母, 且不要有重复的单词
1
2
3
4
5
6
7
|
# BAD
import (
"MyUtils"
"blog_server"
"blog-server"
"blog server"
)
|
1
2
3
4
5
|
# GOOD
import (
"cmd5"
"blog"
)
|
3. 文件或文件夹名
文件或文件夹名建议使用 蛇形命名,一些系统并不会对文件名区分大小写
避免和保留特定用法的后缀冲突
1
2
3
|
# 系统相关
_386.go、_amd64.go、_arm.go、_arm64.go、_android.go、_darwin.go、_dragonfly.go、_freebsd.go、_linux.go、_nacl.go、_netbsd.go、_openbsd.go、_plan9.go、_solaris.go、_windows.go、_android_386.go、_android_amd64.go、_android_arm.go、_android_arm64.go、_darwin_386.go、_darwin_amd64.go、_darwin_arm.go、_darwin_arm64.go、_dragonfly_amd64.go、_freebsd_386.go、_freebsd_amd64.go、_freebsd_arm.go、_linux_386.go、_linux_amd64.go、_linux_arm.go、_linux_arm64.go、_linux_mips64.go、_linux_mips64le.go、_linux_ppc64.go、_linux_ppc64le.go、_linux_s390x.go、_nacl_386.go、_nacl_amd64p32.go、_nacl_arm.go、_netbsd_386.go、_netbsd_amd64.go、_netbsd_arm.go、_openbsd_386.go、_openbsd_amd64.go、_openbsd_arm.go、_plan9_386.go、_plan9_amd64.go、_plan9_arm.go、_solaris_amd64.go、_windows_386.go
_windows_amd64.go
|
4. 常量
- 使用大小写混排的驼峰命名,不允许出现下划线
- 字母缩略词应全大写 , 像ASCII和HTML这样的缩略词则避免使用大小写混合的写法,它们可能被称为htmlEscape、HTMLEscape或escapeHTML,但不会是escapeHtml。
1
2
3
|
# BAD
BLOG_SERVER
escapeHtml
|
1
2
3
|
# GOOD
BlogServer
escapeHTML
|
按照功能来区分,而非所有类型都分在一组,公共常量置于私有常量之前
1
2
3
4
5
6
7
8
9
10
|
# BAD
const (
# 错误 : 私有常量应写公有常量后面
blog = "BLOG"
Page=1 # 用于分页
Limit=10
Page404 = "404" # 标记
...
)
|
1
2
3
4
5
6
7
8
9
10
11
12
|
# GOOD
const (
# 分页
Page = 1
Limit = 10
# 标记
Page404 = "404"
# 私有常量
blog = "BLOG"
)
|
5. 变量
使用大小写混排的驼峰命名,不允许出现下划线
局部变量简短
- 用 i 比 index 更合适
- 用 r 比 reader 更合适
- 若为 bool 类型, 应以 has,is ,can,allow 开头
考虑上下文, 避免使用冗余名称
Good code
1
2
3
4
5
6
7
8
9
10
11
12
13
|
func RuneCount(b []byte) int {
count := 0
for i := 0; i < len(b); {
if b[i] < RuneSelf {
i++
} else {
_, n := DecodeRune(b[i:])
i += n
}
count++
}
return count
}
|
全局变量
变量长度应与作用域相关,作用域越小,则使用简短的单字母
作用域越大,可定义完整单词或有意义的句子
6. 结构体
建议采用名词
7. 接口
仅指定一种方法的接口通常在函数名后附加 er
,尽管可能不是正确的英语
1
2
3
4
5
6
7
8
|
type Reader interface {
Read(p []byte) (n int, err error)
}
type Execer interface {
Exec(query string, args []Value) (Result, error)
}
|
8. 函数
函数名力求精简准确,并采用动词
函数参数
类型是描述性的, 应该简短
1
2
|
func AfterFunc(d Duration, f func()) *Timer
func Escape(w io.Writer, s []byte)
|
函数名明确,类型不明确,参数名称可使用单词缩略
1
|
func Unix(sec,nsec int64) time
|
参考