2.1. 命名
Go语言中的的函数名, 变量名, 常量名, 类型名, 语句段标签名, 和 包名 等所有的命名, 都遵循一个命名规则: 一个名字必须以一个字母(Unicode字母)或下划线开头, 后面可以跟任意数量的字母,数字或下划线. 不同大小写字母是不同的: heapSort
和 Heapsort
是两个不同的名字.
Go语言类似 if
和 switch
的关键字有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多个预先定义的名字, 比如 int
和 true
等, 主要用于内建的常量, 类型, 和 函数.
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程序员推荐使用驼峰式
命名, 当名字有几个单词的时优先使用大小写分隔, 而不是优先用下划线分隔. 因此, 标准库有 QuoteRuneToASCII
和 parseRequestLine
这样的函数命名, 但是不会用 quote_rune_to_ASCII
和 parse_request_line
这样的命名. 像 ASCII
和 HTML
这样的缩略词避免使用大小写混合, 它们可能被称为 htmlEscape
, HTMLEscape
或 escapeHTML
, 但不会是 escapeHtml
.