golang 編程規(guī)范

[TOC]

介紹

本文更多的介紹代碼管理和檢查工具
而不是大篇幅風(fēng)格文檔忆植,畢竟文檔不如工具掃描有時(shí)效性和可行性

官方代碼編程風(fēng)格文檔
https://golang.org/doc/effective_go.html

uber golang 代碼規(guī)范 https://github.com/uber-go/guide
uber golang 代碼規(guī)范中文 https://github.com/xxjwxc/uber_go_guide_cn

代碼目錄規(guī)范

目錄結(jié)構(gòu) 推薦目錄結(jié)構(gòu)
https://github.com/golang-standards/project-layout

GOPATH 設(shè)置規(guī)范

  • 建議只使用一個(gè) GOPATH
  • 不建議使用多個(gè) GOPATH,如果使用多個(gè)GOPATH铺罢,編譯生效的 bin 目錄是在第一個(gè) GOPATH 下

golang 在 1.11 以后,弱化了 GOPATH 規(guī)則残炮,已有代碼(很多庫肯定是在1.11之前建立的)肯定符合這個(gè)規(guī)則
建議保留 GOPATH 規(guī)則韭赘,便于維護(hù)代碼

go mod 工具鏈在 GOPATH 代碼下,需要額外打開環(huán)境變量配置 GO111MODULE=on
go 1.13 以后可以設(shè)置

$ go env -w GO111MODULE='on'

工程根目錄規(guī)范

golang工程結(jié)構(gòu)很重要势就,決定了代碼是否可以共享和維護(hù)
編寫的代碼在$GOPATH/src/

按維護(hù)需求必須這樣放置

${GOPATH}/src/${GIT_HOST}/{$GIT_USER}|${GIT_GROUP}/${PROJ_ROOT}

  • GIT_HOST git 倉庫 host
  • GIT_USER git 用戶名稱 同 GIT_GROUP 二選一
  • GIT_GROUP git 工作組名稱 GIT_USER 二選一
  • PROJ_ROOT 項(xiàng)目根

例如 github.com/sinlov/go-cli-fast-temp golang CLI 工具模板項(xiàng)目
就在 $GOPATH/src/ 下 github.com 的host sinlov 用戶 go-cli-fast-temp 工程名

工程名泉瞻,在模板或者非產(chǎn)品工程脉漏,使用 - 分割,如果是產(chǎn)品線級(jí)瓦灶,防止跨平臺(tái)兼容問題請(qǐng)使用 全小寫無分割符的 c 風(fēng)格

工程子包名規(guī)范

  • 代碼包名必須和當(dāng)前文件路徑的父目錄同名鸠删,增強(qiáng)可讀性
  • 防止跨平臺(tái)兼容問題請(qǐng)使用 全小寫無分割符的 c 風(fēng)格
  • 不要使用任何 golang 官方包已經(jīng)存在的包名
  • 不要使用 DI 注入工具編寫業(yè)務(wù)代碼,防止引用錯(cuò)誤

golang代碼文件命名規(guī)范

  • 工具代碼文件 駝峰命名描述工具作用贼陶,暴露 Pascal 風(fēng)格的操作名
  • 模型代碼文件刃泡,全小寫,描述單一模型碉怔,暴露 Pascal 風(fēng)格的模型 type 或者 interface
  • 業(yè)務(wù)代碼文件 全小寫烘贴,描述業(yè)務(wù)合輯,不得暴露工具類意圖
  • 測(cè)試代碼文件撮胧,必須為某個(gè)代碼的 _test.go 不得跨文件編寫測(cè)試代碼

golang編碼實(shí)現(xiàn)規(guī)范

  • 不要在init函數(shù)里做與變量初始化無關(guān)的工作

編程規(guī)范檢查工具

golang 生態(tài)鏈本身提供很多代碼規(guī)范的工具桨踪,不用額外制定規(guī)范

靜態(tài)檢查工具

靜態(tài)檢查工具在 CI/CD 鏈中集成,即時(shí)發(fā)現(xiàn)即時(shí)補(bǔ)救

go vet

go vet 是一個(gè)用于檢查Go語言源碼中靜態(tài)錯(cuò)誤的簡單工具
go vet命令可以接受 -n 標(biāo)記和 -x 標(biāo)記

go tool vet

go tool vet 命令的作用是檢查Go語言源代碼并且報(bào)告可疑的代碼編寫問題

比如芹啥,在調(diào)用Printf函數(shù)時(shí)沒有傳入格式化字符串锻离,以及某些不標(biāo)準(zhǔn)的方法簽名,等等

該命令使用試探性的手法檢查錯(cuò)誤墓怀,因此并不能保證報(bào)告的問題確實(shí)需要解決汽纠。它確實(shí)能夠找到一些編譯器沒有捕捉到的錯(cuò)誤。

go tool vet 命令的標(biāo)記

-all 進(jìn)行全部檢查傀履。如果有其他檢查標(biāo)記被設(shè)置虱朵,則命令程序會(huì)將此值變?yōu)閒alse。默認(rèn)值為true钓账。
-asmdecl 對(duì)匯編語言的源碼文件進(jìn)行檢查碴犬。默認(rèn)值為false。
-assign 檢查賦值語句梆暮。默認(rèn)值為false服协。
-atomic 檢查代碼中對(duì)代碼包sync/atomic的使用是否正確。默認(rèn)值為false惕蹄。
-buildtags 檢查編譯標(biāo)簽的有效性蚯涮。默認(rèn)值為false。
-composites 檢查復(fù)合結(jié)構(gòu)實(shí)例的初始化代碼卖陵。默認(rèn)值為false遭顶。
-compositeWhiteList 是否使用復(fù)合結(jié)構(gòu)檢查的白名單。僅供測(cè)試使用泪蔫。默認(rèn)值為true棒旗。
-methods 檢查那些擁有標(biāo)準(zhǔn)命名的方法的簽名。默認(rèn)值為false。
-printf 檢查代碼中對(duì)打印函數(shù)的使用是否正確铣揉。默認(rèn)值為false饶深。
-printfuncs 需要檢查的代碼中使用的打印函數(shù)的名稱的列表,多個(gè)函數(shù)名稱之間用英文半角逗號(hào)分隔逛拱。默認(rèn)值為空字符串敌厘。
-rangeloops 檢查代碼中對(duì)在```range```語句塊中迭代賦值的變量的使用是否正確。默認(rèn)值為false朽合。
-structtags 檢查結(jié)構(gòu)體類型的字段的標(biāo)簽的格式是否標(biāo)準(zhǔn)俱两。默認(rèn)值為false。
-unreachable 查找并報(bào)告不可到達(dá)的代碼曹步。默認(rèn)值為false宪彩。

more info see go 命令教程

race condition 競爭檢查

資源競爭檢查,并發(fā)時(shí)遇到的問題讲婚,會(huì)導(dǎo)致并發(fā)能力下降, 長時(shí)間運(yùn)行一般會(huì)出現(xiàn)這個(gè)錯(cuò)誤

panic: runtime error: invalid memory address or nil pointer dereference
  • 檢查方法
# 任意代碼尿孔,構(gòu)建時(shí)加入?yún)?shù)`-race`
go build -race

文檔見 http://blog.golang.org/race-detector

風(fēng)格檢查

不建議制定風(fēng)格檢查文檔,又冗長筹麸,又無法實(shí)施

golint

安裝方法

go get -v github.com/golang/lint
go install github.com/golang/lint

使用

golint [dir or file]

風(fēng)格檢查樣例 https://github.com/golang/lint/tree/master/testdata

golint 檢查范圍就非常廣了活合,也很嚴(yán)格,可以配合 vscode 的 go 插件物赶,或者 goland 的 golint 來檢查代碼風(fēng)格

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末芜辕,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子块差,更是在濱河造成了極大的恐慌,老刑警劉巖倔丈,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件憨闰,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡需五,警方通過查閱死者的電腦和手機(jī)鹉动,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宏邮,“玉大人泽示,你說我怎么就攤上這事∶郯保” “怎么了械筛?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長飒炎。 經(jīng)常有香客問我埋哟,道長,這世上最難降的妖魔是什么郎汪? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任赤赊,我火速辦了婚禮闯狱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘抛计。我一直安慰自己哄孤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布吹截。 她就那樣靜靜地躺著瘦陈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪饭弓。 梳的紋絲不亂的頭發(fā)上双饥,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音弟断,去河邊找鬼咏花。 笑死,一個(gè)胖子當(dāng)著我的面吹牛阀趴,可吹牛的內(nèi)容都是我干的昏翰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼刘急,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼棚菊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起叔汁,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤统求,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后据块,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體码邻,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年另假,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了像屋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡边篮,死狀恐怖己莺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情戈轿,我是刑警寧澤凌受,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站凶杖,受9級(jí)特大地震影響胁艰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一腾么、第九天 我趴在偏房一處隱蔽的房頂上張望奈梳。 院中可真熱鬧,春花似錦解虱、人聲如沸攘须。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽于宙。三九已至,卻和暖如春悍汛,著一層夾襖步出監(jiān)牢的瞬間捞魁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來泰國打工离咐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谱俭,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓宵蛀,卻偏偏與公主長得像昆著,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子术陶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355