Go 技篇第二 命名規範

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

本篇主要講述Go語言的命名規範。
優秀的代碼必須具備良好的可讀性,而可讀性的關鍵即在於命名風格。

原文連結: http://zablog.me/2017/09/08/go_tricks_and_tips_2/

優秀的命名

優秀的命名應當是一貫的、短小的、精確的。
所謂一貫,就是說同一個意義在不同的環境下的命名應當一致,譬如依賴關係,不要在一個方法中命名為depend,另一個方法中命名為rely。
所謂短小,不必多言,當命名過長的時候,讀者可能更關注命名本身,而忽視真正的邏輯內容。
所謂精確,就是命名達意、易於理解

首條經驗

聲明位置與使用位置越遠,則命名應當越長。

駱駝命名法

Go語言應該使用 MixedCase
(不要使用 names_with_underscores)
首字母縮寫詞都應該用大寫,譬如ServeHTTPsceneIDCIDRProcessor

局部變數

局部變數應當儘可能短小,譬如使用buf指代buffer,使用i指代index
在很長的函數中可能會有很多的變數,這個時候可以適當使用一些長名字。
但是寫出這麼長的函數,通常意味著代碼需要重構了!??

參數

函數的參數和局部變數類似,但是它們預設還具有文檔的功能
當參數類型具有描述性的時候,參數名就應該儘可能短小:

123
func AfterFunc(d Duration, f func()) *Timerfunc Escape(w io.Writer, s []byte)

當參數類型比較模糊的時候,參數名就應當具有文檔的功能:

123
func Unix(sec, nsec int64) Timefunc HasPrefix(s, prefix []byte) bool

傳回值

在Go語言中,傳回值可以定義名稱的,它可以當做一種特殊的參數。
尤其重要的是,在外部可見的函數中,傳回值的名稱應當可以作為文檔參考。

12345
func Copy(dst Writer, src Reader) (written int64, err error)func ScanBytes(data []byte, atEOF bool) (advance int, token []byte, err error)

方法接收者(Receiver)

方法接收者也是一種特殊的參數。Go語言中沒有明顯的物件導向的概念,可以對方法定義方法接收者來實作類別似於對象的方法的概念。

按照慣例,由於方法接收者在函數內部經常出現,因此它經常採用一兩個字母來標識方法接收者的類型。

123456
func (b *Buffer) Read(p []byte) (n int, err error)func (sh serverHandler) ServeHTTP(rw ResponseWriter, req *Request)func (r Rectangle) Size() Point

需要注意的是,方法接收者的名字在同一類型的不同方法中應該保持統一,這也是前文所述的一貫性的需求。

匯出包層級命名

匯出名被使用的時候通常是放在包名後
所以,在匯出變數、常數、函數和類型的時候,
不要把包名的意義再寫一遍

比較好的名字
bytes.Buffer strings.Reader

比較蠢的名字
bytes.ByteBuffer strings.StringReader

介面類型

只含有一個方法的介面類型通常以函數名加上er尾碼作為名字

1234
type Reader interface {    Read(p []byte) (n int, err error)}

有時候可能導致蹩腳的英文,但別管他,能看懂就好

123
type Execer interface {    Exec(p []byte) (n int, err error)}

有時候可以適當調整一下英文單詞的順序,增加可讀性:

123
type ByteReader interface {    ReadByte(p []byte) (n int, err error)}

當介面含有多個方法的時候,還是要選取一個能夠精準描述介面目的的名字,譬如net.Connhttp/ResponseWriter

Error的命名

Error類型應該寫成FooError的形式

123
type ExitError struct {....}

Error變數協程ErrFoo的形式

1
var ErrFormat = errors.New("unknown format")

包的命名

應當與它匯出代碼的內容相關,避免utilcommon這種寬泛的命名

引入路徑

包路徑的最後一個單詞應該和包名一致

包路徑應該儘可能簡潔

記得把庫的主要代碼直接放在程式碼程式庫的根目錄

避免在包路徑中使用任何大寫字母(並非所有檔案系統都區分大小寫)

標準庫

上述很多例子都是從標準庫中來的

標準庫的很多內容都可以作為參考
多看看標準庫來尋求靈感吧

但是要記住:

當作者寫標準庫的時候,他們自己也在學習過程中。
多數情況下作者是對的,但是偶爾還是會犯一些錯誤

參考文獻

  1. What’s in a name? - Andrew Gerrand

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.