Go 語言命名約定
計算機科學只存在兩個難題:緩存失效和命名。
名字很重要
- • 可讀性是好代碼的衡量標準。
- • 好名字對可讀性至關重要。
好的名字
- • 一致:容易猜測。
- • 簡短:容易輸入。
- • 準確:容易理解。
約定
通用
- • 使用混合大小寫,不要使用下劃線,縮略詞應該全大寫,例如
ServeHTTP
和IDProcessor
。 - • 名稱聲明與使用之間的距離越長,名稱應該越長。
- • 儘量保持簡短,長名稱模糊了代碼作用,例如
i
比index
更好。 - • 使用重複的字母表示集合 / 切片 / 數組,例如
tt
代表[]*Thing
。 - • 考慮上下文和慣例,避免冗餘,例如在
RuneCount
函數中,count
比runeCount
更好。
函數
- • 如果函數參數類型具有描述性的,則應簡短;如果是模糊的,則應提供補充說明。
- • 導出函數返回值應僅出於文檔目的而命名。
- • 函數接收者名稱應儘量簡短,通常是一兩個字符。
- • 某一類型的所有函數的接收者的名稱應保持一致。
接口
- • 如果接口只有一個方法,接口通常只是在函數名稱後追加
er
,即使語法不正確也可接受,例如Execer
接口下有Exec
方法,不過有時爲了可讀性可作調整,例如ByteReader
接口下有ReadByte
方法。 - • 如果一個接口有多個方法,選擇一個能準確描述目的的名字,例如
net.Conn
和http.ResponseWriter
。
錯誤
- • 定義錯誤類型通常以
Error
結尾,例如FooError
。 - • 聲明錯誤類型變量應該以
Err
開頭,例如ErrFoo
。
包
- • 包名中沒有任何單詞分割符,例如避免用下劃線連接。
- • 包路徑避免使用大寫,因爲並不是所有文件系統區分大小寫。
- • 包路徑最後一個組成部分應該與包名稱相同,例如路徑
compress/gzip
的包名爲gzip
。 - • 導出的名稱由其包名稱限定,這就是爲什麼有
bytes.Buffer
和strings.Reader
,而沒有bytes.BytesBuffer
和strings.StringReader
。 - • 避免倉庫名和包名中出現冗餘,對於庫項目,可以將所有代碼放入項目根目錄下。例如
github.com/golang/oauth2
比code.google.com/p/goauth2/oauth2
好。 - • 選擇有意義的包名,避免使用空泛的
util
、common
和helper
等等。
小結
- • 使用短名稱。
- • 考慮上下文。
- • 運用你的判斷。
參考鏈接
•What's in a name? by Andrew Gerrand[1]•Effective Go[2]•Package names[3]•Go Code Review Comments[4]•Style guideline for Go packages[5]•Ashley McNamara + Brian Ketelsen: Go best practices[6]
引用鏈接
[1]
What's in a name? by Andrew Gerrand: https://talks.golang.org/2014/names.slide
[2]
Effective Go: https://golang.org/doc/effective_go.html#names
[3]
Package names: https://blog.golang.org/package-names
[4]
Go Code Review Comments: https://github.com/golang/go/wiki/CodeReviewComments
[5]
Style guideline for Go packages: https://rakyll.org/style-packages
[6]
Ashley McNamara + Brian Ketelsen: Go best practices: https://www.youtube.com/watch?v=MzTcsI6tn-0
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/g-FZ9rW_h9klugUZZQrWIw