2.1. 命名

Go语言中的的函数名, 变量名, 常量名, 类型名, 语句段标签名, 和 包名 等所有的命名, 都遵循一个命名规则: 一个名字必须以一个字母(Unicode字母)或下划线开头, 后面可以跟任意数量的字母,数字或下划线. 不同大小写字母是不同的: heapSortHeapsort 是两个不同的名字.

Go语言类似 ifswitch 的关键字有25个; 关键字不能用于自定义名字, 只能在特定语法中使用.

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

此外, 还有大约30多个预先定义的名字, 比如 inttrue 等, 主要用于内建的常量, 类型, 和 函数.

Constants:  true false iota nil

Types:      int int8 int16 int32 int64
            uint uint8 uint16 uint32 uint64 uintptr
            float32 float64 complex128 complex64
            bool byte rune string error

Functions:  make len cap new append copy close delete
            complex real imag
            panic recover

这些内部预先定义的名字不是关键字, 你可以在定义中重现使用它们. 在一些特殊的场景重新定义是有意义的, 但是也要注意避免引起混乱.

如果一个实体是在函数内部定义, 那么它的就只在函数内部有效. 如果是在函数外部定义, 那么将在当前包的所有文件中都可以访问. 名字的开头字母的大小写决定了名字在包外的可见性. 如果一个名字是大写字母开头的, 那么它将是导出的, 也就是可以被外部的包访问, 例如 fmt 包的 Printf 函数就是导出的, 可以在 fmt 包外部访问. 包本身的名字一般总是用小写字母.

名字的长度没有限制, 但是Go的风格是尽量使用短小的名字, 对于局部变量尤其是这样; 你会经常看到 i 之类的名字, 而是冗长的 theLoopIndex. 通常来说, 如果一个名字的作用域比较大, 生命周期较长, 那么用长的名字将更有意义.

在习惯上, Go程序员推荐使用驼峰式命名, 当名字有几个单词的时优先使用大小写分隔, 而不是优先用下划线分隔. 因此, 标准库有 QuoteRuneToASCIIparseRequestLine 这样的函数命名, 但是不会用 quote_rune_to_ASCIIparse_request_line 这样的命名. 像 ASCIIHTML 这样的缩略词避免使用大小写混合, 它们可能被称为 htmlEscape, HTMLEscapeescapeHTML, 但不会是 escapeHtml.