## 5.4\. 命名
名稱在 Go 里和在其它語言里一樣重要。某種情況下它們甚至有語義效果:例如,一個名稱能否在包外可見取決于它的第一個字母是否大寫。所以值得花點時間探討下 Go 程序的命名約定:
### 5.4.1\. 包的命名
當包引入時,包名成為其內容的引導符。
`import "bytes"`
后, 導入者可以講 bytes.Buffer。更有用的是每個包的用戶都能使用相同的名稱指出它的內容,亦即包應有個好名稱:短,精,好記。習慣上包名是小寫的單字的名稱;應無必要用下劃線或大小混寫。簡錯不糾,因為你的包的每個用戶都要敲這個名字。還有不要無謂煩擾撞名。包名只是引入時的默認名;它不需在所有源碼中都唯一,如出現少見的撞名,導入者可以給出不同的名字局部使用。無論如何,撞名很少見,因為 import 用的文件名只決定使用那個包。
另一個習慣是包名是源目錄的基名;src/pkg/container/vector 里的包引入為 “container/vector” 但包名是 vector,不是 container_vector 也不是 containerVector。
導入者使用包名引導其內容 (import . 的記法主要特意用在測試或其它不尋常的場合),所以包的導出的名稱可據此避免結結巴巴。例如,bu?o 包的 buffered reader 叫 Reader,不叫 BufReader,因為用戶看到的是 bu?o.Reader 這個清楚簡短的名稱。再有,因為導入項總是給出其包名,bu?o.Reader 不會和 io.Reader 撞名。類似的,用來生成 ring.Ring 的函數 — 即 Go 的架構函數 — 通常會被稱為NewRing,但因為 Ring 是此包唯一的導出類型,并且既然包名叫ring,它就叫 New。此包的客戶看到的是 ring.New。使用包結構幫你來選個好名。
Another short example is once.Do; once.Do(setup) reads well and would not be improved by writing once.DoOrWaitUntilDone(setup). Long names don't automatically make things more readable. If the name represents something intricate or subtle, it's usually better to write a helpful doc comment than to attempt to put all the information into the name.
### 5.4.2\. 接口的命名
習慣上,單一成員的界面的名稱是其成員名加 -er:Reader, Writer,Formatter 等。
存在這樣的一些名稱,尊重它們和它們所指的函數會工作的更好。Read, Write, Close, Flush, String 等保有正統的簽名和意義。為了避免混淆, 除非有同樣的簽名和意義,不要給你的方法這些名字。同理,如果你的方法實現了和這些著名方法同樣的意圖,給它同樣的名稱和簽名;叫你的字符轉換器 String 而不是 ToString。
### 5.4.3\. 大小寫混寫
最后,Go 習慣使用 MixedCaps 和 mixedCaps,而不是下劃線來寫多字的名稱。
- 1. 關于本文
- 2. Go語言簡介
- 3. 安裝go環境
- 3.1. 簡介
- 3.2. 安裝C語言工具
- 3.3. 安裝Mercurial
- 3.4. 獲取代碼
- 3.5. 安裝Go
- 3.6. 編寫程序
- 3.7. 進一步學習
- 3.8. 更新go到新版本
- 3.9. 社區資源
- 3.10. 環境變量
- 4. Go語言入門
- 4.1. 簡介
- 4.2. Hello,世界
- 4.3. 分號(Semicolons)
- 4.4. 編譯
- 4.5. Echo
- 4.6. 類型簡介
- 4.7. 申請內存
- 4.8. 常量
- 4.9. I/O包
- 4.10. Rotting cats
- 4.11. Sorting
- 4.12. 打印輸出
- 4.13. 生成素數
- 4.14. Multiplexing
- 5. Effective Go
- 5.1. 簡介
- 5.2. 格式化
- 5.3. 注釋
- 5.4. 命名
- 5.5. 分號
- 5.6. 控制流
- 5.7. 函數
- 5.8. 數據
- 5.9. 初始化
- 5.10. 方法
- 5.11. 接口和其他類型
- 5.12. 內置
- 5.13. 并發
- 5.14. 錯誤處理
- 5.15. Web服務器
- 6. 如何編寫Go程序
- 6.1. 簡介
- 6.2. 社區資源
- 6.3. 新建一個包
- 6.4. 測試
- 6.5. 一個帶測試的演示包
- 7. Codelab: 編寫Web程序
- 7.1. 簡介
- 7.2. 開始
- 7.3. 數據結構
- 7.4. 使用http包
- 7.5. 基于http提供wiki頁面
- 7.6. 編輯頁面
- 7.7. template包
- 7.8. 處理不存在的頁面
- 7.9. 儲存頁面
- 7.10. 錯誤處理
- 7.11. 模板緩存
- 7.12. 驗證
- 7.13. 函數文本和閉包
- 7.14. 試試!
- 7.15. 其他任務
- 8. 針對C++程序員指南
- 8.1. 概念差異
- 8.2. 語法
- 8.3. 常量
- 8.4. Slices(切片)
- 8.5. 構造值對象
- 8.6. Interfaces(接口)
- 8.7. Goroutines
- 8.8. Channels(管道)
- 9. 內存模型
- 9.1. 簡介
- 9.2. Happens Before
- 9.3. 同步(Synchronization)
- 9.4. 錯誤的同步方式
- 10. 附錄
- 10.1. 命令行工具
- 10.2. 視頻和講座
- 10.3. Release History
- 10.4. Go Roadmap
- 10.5. 相關資源