前言
本篇主要講述Go語言的命名規(guī)范。優(yōu)秀的代碼必須具備良好的可讀性,而可讀性的關(guān)鍵即在于命名風(fēng)格。
Go的函數(shù)、變量、常量、自定義類型、包(Package)的命名方式遵循以下規(guī)則:
1)首字符可以是任意的Unicode字符或者下劃線
2)剩余字符可以是Unicode字符、下劃線、數(shù)字
3)字符長度不限
Go只有25個關(guān)鍵字
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
優(yōu)秀的命名
首條經(jīng)驗
聲明位置與使用位置越遠,則命名應(yīng)當(dāng)越長。
駱駝命名法
局部變量
參數(shù)
函數(shù)的參數(shù)和局部變量類似,但是它們默認還具有文檔的功能
當(dāng)參數(shù)類型具有描述性的時候,參數(shù)名就應(yīng)該盡可能短小:
func AfterFunc(d Duration, f func()) *Timer func Escape(w io.Writer, s []byte)
當(dāng)參數(shù)類型比較模糊的時候,參數(shù)名就應(yīng)當(dāng)具有文檔的功能:
func Unix(sec, nsec int64) Time func HasPrefix(s, prefix []byte) bool
返回值
在Go語言中,返回值可以定義名稱的,它可以當(dāng)做一種特殊的參數(shù)。
尤其重要的是,在外部可見的函數(shù)中,返回值的名稱應(yīng)當(dāng)可以作為文檔參考。
func Copy(dst Writer, src Reader) (written int64, err error) func ScanBytes(data []byte, atEOF bool) (advance int, token []byte, err error)
方法接收者(Receiver)
方法接收者也是一種特殊的參數(shù)。Go語言中沒有明顯的面向?qū)ο蟮母拍睿梢詫Ψ椒ǘx方法接收者來實現(xiàn)類似于對象的方法的概念。
按照慣例,由于方法接收者在函數(shù)內(nèi)部經(jīng)常出現(xiàn),因此它經(jīng)常采用一兩個字母來標識方法接收者的類型。
func (b *Buffer) Read(p []byte) (n int, err error) func (sh serverHandler) ServeHTTP(rw ResponseWriter, req *Request) func (r Rectangle) Size() Point
需要注意的是,方法接收者的名字在同一類型的不同方法中應(yīng)該保持統(tǒng)一,這也是前文所述的一貫性的需求。
導(dǎo)出包級別命名
導(dǎo)出名被使用的時候通常是放在包名后
所以,在導(dǎo)出變量、常數(shù)、函數(shù)和類型的時候,
不要把包名的意義再寫一遍
比較好的名字
bytes.Buffer strings.Reader
比較蠢的名字
bytes.ByteBuffer strings.StringReader
接口類型
只含有一個方法的接口類型通常以函數(shù)名加上er后綴作為名字
type Reader interface { Read(p []byte) (n int, err error) }
有時候可能導(dǎo)致蹩腳的英文,但別管他,能看懂就好
type Execer interface { Exec(p []byte) (n int, err error) }
有時候可以適當(dāng)調(diào)整一下英文單詞的順序,增加可讀性:
type ByteReader interface { ReadByte(p []byte) (n int, err error) }
當(dāng)接口含有多個方法的時候,還是要選取一個能夠精準描述接口目的的名字,譬如net.Conn、http/ResponseWriter
Error的命名
Error類型應(yīng)該寫成FooError的形式
type ExitError struct { .... }
Error變量協(xié)程ErrFoo的形式
var ErrFormat = errors.New("unknown format")
包的命名
應(yīng)當(dāng)與它導(dǎo)出代碼的內(nèi)容相關(guān),避免util、common這種寬泛的命名
引入路徑
包路徑的最后一個單詞應(yīng)該和包名一致
包路徑應(yīng)該盡可能簡潔
記得把庫的主要代碼直接放在代碼庫的根目錄
避免在包路徑中使用任何大寫字母(并非所有文件系統(tǒng)都區(qū)分大小寫)
標準庫
上述很多例子都是從標準庫中來的
標準庫的很多內(nèi)容都可以作為參考
多看看標準庫來尋求靈感吧
但是要記?。?/p>
當(dāng)作者寫標準庫的時候,他們自己也在學(xué)習(xí)過程中。
多數(shù)情況下作者是對的,但是偶爾還是會犯一些錯誤
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
參考文獻
What's in a name? - Andrew Gerrand