Go中變量命名規(guī)則與實(shí)例
前言
來(lái)自 Google 的 Andrew Gerrand 曾經(jīng)關(guān)于 Go 中的參數(shù)命名規(guī)范進(jìn)行了分享,slides 為 https://talks.golang.org/2014/names.slide
命名習(xí)慣很重要
- 良好的可讀性是高質(zhì)量代碼的要求之一
- 良好的命名習(xí)慣有助于提高代碼可讀性
良好命名喜歡的特質(zhì)
Good Name 將具有如下的特質(zhì):
- Consistent (easy to guess),
- Short (easy to type),
- Accurate (easy to understand)
經(jīng)驗(yàn)法則
變量申明與變量使用之間越遠(yuǎn),那么變量名字應(yīng)當(dāng)越長(zhǎng)。
這也解釋了,為什么 for 循環(huán)次數(shù)變量使用 i 作為遍歷用的臨時(shí)變量,而不是語(yǔ)義上更具體的 index 作為變量名。
大小寫混用的變量名
我們不應(yīng)該使用 names_with_underscores 作為變量名,而是 namesWithUnderscores 作為變量名。
另一方面,首字母縮略詞,應(yīng)當(dāng)是大寫,例如 ServeHTTP 以及 IDProcessor。
這被稱為 MixedCase,類似于駝峰原則命名,但是專業(yè)詞匯的首字母縮寫均應(yīng)當(dāng)寫成大寫形式。
變量名避免冗余
變量名不是越長(zhǎng)越好,常變量名會(huì)模糊代碼功能。
常見的常量、類型組合可能使用非常簡(jiǎn)短的名字:
- 使用 i 而不是 index
- 使用 r 而不是 reader
- 使用 b 而不是 buffer
根據(jù)上下文,避免使用冗余的名稱:
- 在 RuneCount 方法內(nèi)部,使用 count 而不是 reuneCount
- 在 map 語(yǔ)句中,使用 ok 而不是 keyInMap:
v, ok := m[k]
常變量名也許在長(zhǎng)函數(shù)、有很多變量的函數(shù)中有幫助,但是這通常也意味著你應(yīng)該重構(gòu)代碼。
Bad codes vs good codes
// Bad
func RuneCount(buffer []byte) int {
// runeCount -> count
runeCount := 0
// index -> i , buffer -> b
for index := 0; index < len(buffer); {
if buffer[index] < RuneSelf {
index++
} else {
// size -> n
_, size := DecodeRune(buffer[index:])
index += size
}
runeCount++
}
return runeCount
}
// Good
func RuneCount(b []byte) int {
count := 0
for i := 0; i < len(b); {
if b[i] < RuneSelf {
i++
} else {
_, n := DecodeRune(b[i:])
i += n
}
count++
}
return count
}
函數(shù)參數(shù)的命名
函數(shù)參數(shù)與變量名一樣,都起到了文檔的作用。
1.當(dāng)函數(shù)參數(shù)的類型具有描述性時(shí),那么函數(shù)參數(shù)名就可以簡(jiǎn)短一些:
func AfterFunc(d Duration, f func()) *Timer func Escape(w io.Writer, s []byte)
2.當(dāng)函數(shù)參數(shù)的類型語(yǔ)義不清,那么參數(shù)名應(yīng)當(dāng)更具體詳細(xì)一些:
func Unix(sec, nsec int64) Time ???????func HasPrefix(s, prefix []byte) bool
返回值的命名
導(dǎo)出函數(shù)(exported function)返回值應(yīng)當(dāng)僅僅出于編寫文檔目的進(jìn)行命名。
下面是返回值命名的好例子:
// Good func Copy(dst Writer, src Reader) (written int64, err error) // Good func ScanBytes(data []byte, atEOF bool) (advance int, token []byte, err error)
方法 Receiver 的命名
Go 中結(jié)構(gòu)體可以擁有方法,在為結(jié)構(gòu)體聲明方法時(shí),結(jié)構(gòu)體被稱為 receiver。
按照慣例,方法接收者的命名通常為 1 個(gè)字符或者 2 個(gè)字符,因?yàn)榻Y(jié)構(gòu)體的每一個(gè)方法都將使用同一個(gè) receiver 名稱。
// Good func (b *Buffer) Read(p []byte) (n int, err error) // Good func (sh serverHandler) ServeHTTP(rw ResponseWriter, req *Request) // Good func (r Rectangle) Size() Point
Receiver 的名稱一定要確保一致性,如果結(jié)構(gòu)體的 method1 使用 r 作為 receiver 名稱,那么 method2 就不應(yīng)當(dāng)使用 rdr 作為名稱。
導(dǎo)出 package 級(jí)別變量命名
package 級(jí)別的變量已經(jīng)被 package name 限定了,因此需要注意導(dǎo)出變量、常量、函數(shù)、類型名的冗余問(wèn)題。
例如:
- 我們使用 bytes.Buffer 而不是 bytes.ByteBuffer
- 我們使用 strings.Reader 而不是 strings.StringReader
導(dǎo)出變量名不要與 package 之間存在冗余。
接口類型
只有一個(gè)方法的接口,接口名通常簡(jiǎn)單在方法后面加上 er 來(lái)進(jìn)行命令,例如:
type Reader interface {
Read(p []byte) (n int, err error)
}
有時(shí)候,上述策略會(huì)導(dǎo)致接口名語(yǔ)法不正確,但是我們?nèi)匀豢梢赃x擇這么做,例如:
type Execer interface {
Exec(query string, args []Value) (Result, error)
}
也有時(shí)候,我們會(huì)修改接口名,使得其符合英語(yǔ)語(yǔ)法:
type ByteReader interface {
ReadByte() (c byte, err error)
}
當(dāng)一個(gè)接口包含多個(gè)方法時(shí),應(yīng)當(dāng)選擇一個(gè)準(zhǔn)確描述其用途的名稱,例如 net.Conn,http.ResponseWriter,io.ReadWriter。
error 命名
錯(cuò)誤類型與錯(cuò)誤變量應(yīng)當(dāng)有不同的命名格式:
// 錯(cuò)誤類型 Error types
type ExitError struct {
...
}
// 錯(cuò)誤變量 Error values
var ErrFormat = errors.New("image: unknown format")
Packages 名
選擇對(duì)導(dǎo)出的名稱具有意義的包名稱。
避免使用 util、common 等包名。
結(jié)論
使用短變量名
變量取名考慮上下文,避免冗余,例如函數(shù)內(nèi)的局部變量考慮函數(shù)名,包導(dǎo)出變量考慮包名
總結(jié)
到此這篇關(guān)于Go中變量命名的文章就介紹到這了,更多相關(guān)Go變量命名內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang多維度排序及題解最長(zhǎng)連續(xù)序列
這篇文章主要為大家介紹了golang多維度排序及題解最長(zhǎng)連續(xù)序列示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
Go語(yǔ)言fsnotify接口實(shí)現(xiàn)監(jiān)測(cè)文件修改
這篇文章主要為大家介紹了Go語(yǔ)言fsnotify接口實(shí)現(xiàn)監(jiān)測(cè)文件修改的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
Go語(yǔ)言中?Print?Printf和Println?的區(qū)別解析
這篇文章主要介紹了Go語(yǔ)言中?Print?Printf和Println?的區(qū)別,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03
Golang優(yōu)雅關(guān)閉channel的方法示例
Goroutine和channel是Go在“并發(fā)”方面兩個(gè)核心feature,下面這篇文章主要給大家介紹了關(guān)于Golang如何優(yōu)雅關(guān)閉channel的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考解決,下面來(lái)一起看看吧。2017-11-11

