命名原则
命名方式
采用驼峰命名方式(ps:ServiceName),不要使用service_name
缩写要全大写(ServerHTTP)
局部变量
局部变量尽量短小,i
代替index
;
如果函数过长,则需要对代码进行重构
参数
函数参数默认是具有文档性质
当参数类型具有描述性时,则参数应当尽量短小1
2func AfterFunc(d Duration, f func()) *Timer
func Escape(w io.Writer, s []byte)
当参数类型很模糊,则可以使用参数去描述1
2func Unix(sec, nsec int64) Time
func HasPrefix(s, prefix []byte) bool
返回值
返回值可以定义名字,作为文档性质,特别是在外部可见的函数1
2func Copy(dst Writer, src Reader) (written int64, err error)
func ScanBytes(data []byte, atEOF bool) (advance int, token []byte, err error)
方法接收
1 | func (b *Buffer) Read(p []byte) (n int, err error) |
需要注意的是,方法接收者的名字在同一类型的不同方法中应该保持统一,这也是前文所述的一贯性的需求
包级别的命名方式
尽量采用bytes.Buffer
、strings.Read()
不宜采用bytes.ByteBuffer
、strings.StringsRead()
接口类型
只含有一个方法的接口类型通常以函数名加上er
后缀作为名字1
2
3type Reader interface {
Read(p []byte) (n int, err error)
}
接口多比接口少好
Error命名
1 | type ExitError struct { |
包命名
应当与它导出代码的内容相关,避免util
、common
这种宽泛的命名
引入路径
- 包路径的最后一个单词应该和包名一致
- 包路径应该尽可能简洁
- 记得把库的主要代码直接放在代码库的根目录
- 避免在包路径中使用任何大写字母(并非所有文件系统都区分大小写)