gopl-zh.github.com/ch2/ch2-01.md

2.6 KiB

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.