[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)格