Uber 把公司內(nèi)部的《Go 語言風(fēng)格指南》開源了
Uber 近日開放了其公司內(nèi)部使用的《Go 語言風(fēng)格指南》。
根據(jù)Uber的介紹,《Go 語言風(fēng)格指南》是支配Uber代碼的慣例,這些慣例不僅涵蓋源文件格式,而且由gofmt代替處理。(gofmt工具可以幫助開發(fā)者格式化他們的代碼到統(tǒng)一的風(fēng)格。)
本指南通過詳細(xì)介紹了Uber在編寫Go代碼時(shí)的注意事項(xiàng),從而使代碼庫更加易于管理,幫助開發(fā)者們更好的使用Go的語言特性
該指南最初由Prashant Varanasi和Simon Newton編寫,目的是使一些同事快速使用Go。多年來,已根據(jù)其他人的反饋進(jìn)行了多次的修改。
其中許多約定是 Go 的通用準(zhǔn)則,而其它準(zhǔn)則則參考了外部資源:
- Effective Go
- The Go common mistakes guide
所用的代碼在運(yùn)行 golint 和 go vet 之后不會(huì)有報(bào)錯(cuò)。建議將編輯器設(shè)置為:
- 保存時(shí)運(yùn)行 goimports
- 運(yùn)行 golint 和 go vet 來檢查錯(cuò)誤
下面以接口和指針為例
你幾乎不需要指向接口的指針,你應(yīng)該把接口當(dāng)作值傳遞,它的基礎(chǔ)數(shù)據(jù)仍然可以當(dāng)成一個(gè)指針。
一個(gè)接口是兩個(gè)字段:
1、指向特定類型信息的指針。你可以認(rèn)為這是 "type."。
2、數(shù)據(jù)指針,如果存儲(chǔ)的數(shù)據(jù)是指針,則直接存儲(chǔ)。如果數(shù)據(jù)存儲(chǔ)的是值,則存儲(chǔ)指向此值的指針。
如果要接口方法修改基礎(chǔ)數(shù)據(jù),則必須使用指針。
接收器和接口
具有值接收器的方法可以被指針和值調(diào)用。例如:
- type S struct {
- data string
- }
- func (s S) Read() string {
- return s.data
- }
- func (s *S) Write(str string) {
- s.data = str
- }
- sVals := map[int]S{1: {"A"}}
- // You can only call Read using a value
- sVals[1].Read()
- // This will not compile:
- // sVals[1].Write("test")
- sPtrs := map[int]*S{1: {"A"}}
- // You can call both Read and Write using a pointer
- sPtrs[1].Read()
- sPtrs[1].Write("test")
同樣,即使該方法具有值接收器,也可以通過指針來滿足接口。
- type F interface {
- f()
- }
- type S1 struct{}
- func (s S1) f() {}
- type S2 struct{}
- func (s *S2) f() {}
- s1Val := S1{}
- s1Ptr := &S1{}
- s2Val := S2{}
- s2Ptr := &S2{}
- var i F
- i = s1Val
- i = s1Ptr
- i = s2Ptr
- // The following doesn't compile, since s2Val is a value, and there is no value receiver for f.
Effective Go對(duì)Pointers vs. Values分析的不錯(cuò)
目前,guide在Github上標(biāo)星2.9K,獲得246個(gè)Fork(Github地址:https://github.com/uber-go/guide/blob/master/style.md)