命名是编码过程中让程序员十分纠结的一个点,就像每天饭点纠结选择吃什么饭一样,常见且令人抓头,为此专门有人开发了各种命名神器。命名也是十分能体现一个程序员编码水平的一项,好的命名一定程度能代替代码注释,让代码更加清晰易阅读。好的命名取决于你的词汇量、对业务逻辑的理解以及命名过程中的一些通用规范。遵循一定的命名规范,可以使得代码更加优雅,写起代码来更加如鱼得水。Go语言中主要涉及到包命名、文件命名、结构体命名、接口命名、变量命名下面一一介绍这些相关部分的命名规范。

包命名

  • 命名简洁且能概括包功能,参考go标准包都是些简短且辨识度极高的命名。
  • 保持包名和文件目录名称一致
  • 全小写,不要包含特殊分隔符如下划线
  • 不用复数。例如net/url,而不是net/urls
  • 项目名可以使用中横线分隔多个单词
  • 除了广为人知的单词缩写,尽量不要使用缩写
  • 不要用含义宽泛的单词命名,比如“common”,“util”,“lib”等,一般这些单词命名都会往里塞各种乱七八糟的东西,导致依赖关系复杂,不利于阅读。这些包命名作为包下的一个子包名是可以的比如net/util整个包的被引用范围仅限于父包内。
  • 避免将srcpkg放到可导入包路径中
github.com/user/repo/src/httputil   // DON'T DO IT, AVOID SRC!!

github.com/user/repo/gosrc/httputil // DON'T DO IT, AVOID GOSRC!!
  • 导入的包如果包名冲突,可以采用重命名的方式
import (
    gourl "net/url"

    "myother.com/url"
)

文件命名

  • 简短有意义
  • 所有单词小写,多个单词使用下划线分隔

结构体命名

  • 采用驼峰命名,首字母根据访问控制决定是否大小写
  • 避免使用意义宽泛的单词命名
  • 避免使用包名作为前缀,因为引用过程中包名已经在代码关系中了,如果使用GoLand IDE的话ide也会自动提示

接口命名

  • 基本规则和结构体命名保持一致
  • 单函数接口一般函数名加上er后缀作为接口名,如Reader、 Writer、 Formatter、 CloseNotifier。
  • 多个函数类似结构体命名

变量命名

  • 采用驼峰命名,首字母根据访问控制决定是否大小写
  • 专有名词全大写或全小写,比如UrlArr应该写成URLArr或者urlArr。
  • 包内私有全局变量小写字母开头,或者使用"_“开头,保持统一即可
  • 命名简洁,特别是局部变量作用域比较集中时可以使用单首字母,比如index可以直接使用i

常量命名

  • 采用驼峰式
  • 包内私有全局变量小写字母开头,或者使用”_“开头,保持统一即可
  • 枚举类型的常量需要先声明相应类型比如
type Color string
const (
	Blue color = "blue"
	Red  color = "red"	
)

函数命名

  • 采用驼峰命名,首字母根据访问控制决定是否大小写
  • 单测可以使用下划线比如TestFunc_xxx

一些吐槽

命名规范里多次强调简洁简短,这也符合Go语言的设计理念。但在实际业务代码中命名的简短就意味着牺牲一定的可读性,因为业务代码中各种复杂嵌套逻辑很难用一两个单词描述清楚,这就要你做出取舍是保持代码简洁还是保证代码更易读,个人认为在团队里易读让别人更容易看懂还是更重要些。

参考