Go 語言一些最佳實踐:建議收藏
閱讀本文大概需要 4 分鐘。
大家好,我是站長 polarisxu。
看到一個 GitHub 項目,專門總結(jié) Go 語言的一些建議或最佳實踐。這些建議不一定全部適合你,但很多時候是值得借鑒或參考的。
這份 go-advice 包括以下幾個部分:
Go 箴言 Go 之禪 代碼 并發(fā) 性能 模塊 構(gòu)建 測試 工具 Misc
其中,第一部分和第二部分,分別來自 Rob Pike 和 Dave Cheney。
項目地址:https://github.com/cristaloleg/go-advice,還有中文版:https://github.com/cristaloleg/go-advice/blob/master/README_ZH.md。(文章底部「閱讀原文」可直達)
我們看幾個「代碼」部分的實踐或建議。
01 格式化
這個相信很多人已經(jīng)養(yǎng)成習慣了,而且一般 IDE 會自動做這件事。go fmt:這是 Go 愛好者喜歡的功能之一。團隊中,可以為 git 創(chuàng)建鉤子或在 CI/CD 系統(tǒng)中自動執(zhí)行 go fmt,當然最好是每個人養(yǎng)成這樣的習慣,比如強制要求編輯器配置上自動 go fmt。
02 使用語義明確的表示
很多時候,不同的代碼能表示相同的意思。但代碼應(yīng)該是寫給人閱讀的,只是偶爾被機器執(zhí)行一下。因此,閱讀性應(yīng)該提到一個更高的要求。這個項目對此作了一些建議,讓你在寫出的代碼更可讀。
用 chan struct{} 來傳遞信號,chan bool 表達的不夠清楚 30 * time.Second 比 time.Duration(30) * time.Second 更好 用 time.Duration 代替 int64 + 變量名 不要依賴于計算順序,特別是在 return 語句中 。。。
03 一些小技巧
有時候,為了代碼更可讀或為了一致性,亦或是避免一些潛在的問題發(fā)生,我們會在團隊做相關(guān)的代碼風格規(guī)定。除了規(guī)定,如果你寫的代碼,希望使用者能夠更規(guī)范的用,有些地方可以使用一些技巧。
防止結(jié)構(gòu)體字段用純值方式初始化,添加 _ struct {} 字段
我們知道,結(jié)構(gòu)體初始化時,可以用純值初始化。比如:
type Point struct {
X, Y float64
}
可以如下兩種方式初始化:
Point {X:1,Y:1}
Point {1, 1}
很顯然,第一種方式可讀性更好。如果你希望限制只能第一種方式,可以這么做:
type Point struct {
_ struct{}
X, Y float64
}
go-advice 項目中把 _ struct{} 放在了結(jié)構(gòu)體最后,這會讓結(jié)構(gòu)體的空間增加,而放在開始卻不會增加。即
type Point struct {
_ struct{}
X, Y float64
}和
type Point struct {
X, Y float64
_ struct{}
}的空間占用是不一樣的,你知道為什么嗎?
所以,對每個建議,我們應(yīng)該認真審視,而不是人為這上面說的就一定對。
JavaScript 解析整數(shù)為浮點數(shù)并且你的 int64 可能溢出
這個問題很多人可能會遇到??梢栽囋嚰由线@個 tag:json:"id:string"
type Request struct {
ID int64 `json:"id,string"`
}
04 總結(jié)
這個項目提到的很多建議或?qū)嵺`,認真閱讀,同時審視下自己是怎么做的,它的建議是否合理?!好的地方,不防借鑒下。
建議可以多逛逛 GitHub,發(fā)現(xiàn)好項目~
我是 polarisxu,北大碩士畢業(yè),曾在 360 等知名互聯(lián)網(wǎng)公司工作,10多年技術(shù)研發(fā)與架構(gòu)經(jīng)驗!2012 年接觸 Go 語言并創(chuàng)建了 Go 語言中文網(wǎng)!
堅持輸出技術(shù)(包括 Go、Rust 等技術(shù))、職場心得和創(chuàng)業(yè)感悟!歡迎關(guān)注「polarisxu」一起成長!
