golang 編程風格最佳實踐

介紹

本文更多的介紹代碼管理和檢查工具而不是大篇幅風格文檔,畢竟文檔只能那裏看,不如工具有時效性和可行性,畢竟說到不如做到

代碼目錄規範

目錄結構 推薦目錄結構 https://github.com/golang-standards/project-layout

GOPATH 設置規範

建議保留 GOPATH 規則,便於維護代碼

golang 在 1.11 以後,弱化了 GOPATH 規則,已有代碼 (很多庫肯定是在 1.11 之前建立的) 肯定符合這個規則

go mod 工具鏈在 GOPATH 代碼下,需要額外打開環境變量配置 GO111MODULE=on go 1.13 以後可以設置兼容

$ go env -w GO111MODULE='on'

工程根目錄規範

golang 工程結構很重要,決定了代碼是否可以共享和維護

編寫的代碼在$GOPATH/src/

按維護需求必須這樣放置

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

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

工程名,在模板或者非產品工程,使用 - 分割,如果是產品線級,防止跨平臺兼容問題請使用 全小寫無分割符的 c 風格

工程子包名規範

golang 代碼文件命名規範

golang 編碼實現規範

更多規範建議看

編程規範檢查工具

golang 生態鏈本身提供很多代碼規範的工具,不用額外製定規範

靜態檢查工具

靜態檢查工具在 CI/CD 鏈中集成,即時發現即時補救

go vet

go vet 是一個用於檢查 Go 語言源碼中靜態錯誤的簡單工具 go vet 命令可以接受 -n 標記和 -x 標記

go tool vet

go tool vet 命令的作用是檢查 Go 語言源代碼並且報告可疑的代碼編寫問題

比如,在調用 Printf 函數時沒有傳入格式化字符串,以及某些不標準的方法簽名,等等

該命令使用試探性的手法檢查錯誤,因此並不能保證報告的問題確實需要解決。它確實能夠找到一些編譯器沒有捕捉到的錯誤。

go tool vet 命令的標記

-all 進行全部檢查。如果有其他檢查標記被設置,則命令程序會將此值變爲false。默認值爲true。
-asmdecl 對彙編語言的源碼文件進行檢查。默認值爲false。
-assign 檢查賦值語句。默認值爲false。
-atomic 檢查代碼中對代碼包sync/atomic的使用是否正確。默認值爲false。
-buildtags 檢查編譯標籤的有效性。默認值爲false。
-composites 檢查複合結構實例的初始化代碼。默認值爲false。
-compositeWhiteList 是否使用複合結構檢查的白名單。僅供測試使用。默認值爲true。
-methods 檢查那些擁有標準命名的方法的簽名。默認值爲false。
-printf 檢查代碼中對打印函數的使用是否正確。默認值爲false。
-printfuncs 需要檢查的代碼中使用的打印函數的名稱的列表,多個函數名稱之間用英文半角逗號分隔。默認值爲空字符串。
-rangeloops 檢查代碼中對在```range```語句塊中迭代賦值的變量的使用是否正確。默認值爲false。
-structtags 檢查結構體類型的字段的標籤的格式是否標準。默認值爲false。
-unreachable 查找並報告不可到達的代碼。默認值爲false。

race condition 競爭檢查

資源競爭檢查,併發時遇到的問題,會導致併發能力下降, 長時間運行一般會出現這個錯誤

panic: runtime error: invalid memory address or nil pointer dereference
# 任意代碼,構建時加入參數`-race`
go build -race

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

風格檢查

不建議制定風格檢查文檔,又冗長,又無法實施

golint

安裝方法

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

使用

golint [dir or file]

風格檢查樣例 https://github.com/golang/lint/tree/master/testdata

golint 檢查範圍就非常廣了,也很嚴格,可以配合 vscode 的 go 插件,或者 goland 的 golint 來檢查代碼風格

轉自:sinlov

blog.sinlov.cn/posts

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/FbjZ1oK0RZY49bOMvdJAYw