W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
原文鏈接:https://gopl-zh.github.io/ch10/ch10-06.html
在本節(jié)中,我們將提供一些關(guān)于Go語言獨特的包和成員命名的約定。
當(dāng)創(chuàng)建一個包,一般要用短小的包名,但也不能太短導(dǎo)致難以理解。標(biāo)準(zhǔn)庫中最常用的包有bufio、bytes、flag、fmt、http、io、json、os、sort、sync和time等包。
盡可能讓命名有描述性且無歧義。例如,類似imageutil或ioutilis的工具包命名已經(jīng)足夠簡潔了,就無須再命名為util了。要盡量避免包名使用可能被經(jīng)常用于局部變量的名字,這樣可能導(dǎo)致用戶重命名導(dǎo)入包,例如前面看到的path包。
包名一般采用單數(shù)的形式。標(biāo)準(zhǔn)庫的bytes、errors和strings使用了復(fù)數(shù)形式,這是為了避免和預(yù)定義的類型沖突,同樣還有g(shù)o/types是為了避免和type關(guān)鍵字沖突。
要避免包名有其它的含義。例如,2.5節(jié)中我們的溫度轉(zhuǎn)換包最初使用了temp包名,雖然并沒有持續(xù)多久。但這是一個糟糕的嘗試,因為temp幾乎是臨時變量的同義詞。然后我們有一段時間使用了temperature作為包名,顯然名字并沒有表達(dá)包的真實用途。最后我們改成了和strconv標(biāo)準(zhǔn)包類似的tempconv包名,這個名字比之前的就好多了。
現(xiàn)在讓我們看看如何命名包的成員。由于是通過包的導(dǎo)入名字引入包里面的成員,例如fmt.Println,同時包含了包名和成員名信息。因此,我們一般并不需要關(guān)注Println的具體內(nèi)容,因為fmt包名已經(jīng)包含了這個信息。當(dāng)設(shè)計一個包的時候,需要考慮包名和成員名兩個部分如何很好地配合。下面有一些例子:
bytes.Equal flag.Int http.Get json.Marshal
我們可以看到一些常用的命名模式。strings包提供了和字符串相關(guān)的諸多操作:
package strings
func Index(needle, haystack string) int
type Replacer struct{ /* ... */ }
func NewReplacer(oldnew ...string) *Replacer
type Reader struct{ /* ... */ }
func NewReader(s string) *Reader
包名strings并沒有出現(xiàn)在任何成員名字中。因為用戶會這樣引用這些成員strings.Index、strings.Replacer等。
其它一些包,可能只描述了單一的數(shù)據(jù)類型,例如html/template和math/rand等,只暴露一個主要的數(shù)據(jù)結(jié)構(gòu)和與它相關(guān)的方法,還有一個以New命名的函數(shù)用于創(chuàng)建實例。
package rand // "math/rand"
type Rand struct{ /* ... */ }
func New(source Source) *Rand
這可能導(dǎo)致一些名字重復(fù),例如template.Template或rand.Rand,這就是這些種類的包名往往特別短的原因之一。
在另一個極端,還有像net/http包那樣含有非常多的名字和種類不多的數(shù)據(jù)類型,因為它們都是要執(zhí)行一個復(fù)雜的復(fù)合任務(wù)。盡管有將近二十種類型和更多的函數(shù),但是包中最重要的成員名字卻是簡單明了的:Get、Post、Handle、Error、Client、Server等。
![]() | ![]() |
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: