golang一些常用的靜態(tài)檢查工具詳解
一、背景
俗話說,工欲善其事,必先利其器。go 作為一個(gè)對(duì)基礎(chǔ)功能封裝非常好的語言,對(duì)編碼體驗(yàn),如何更高效地寫出高性能代碼,都是考慮非常好的。因此,如何能夠?qū)懗龈烙^、更安全的golang代碼,也是我們需要關(guān)注的目標(biāo)。go 本身也提供了非常多的工具供我們使用。
這里先將所有常用的指令放到這個(gè)表格中:
二、gofmt
主要修復(fù)代碼格式,比如代碼塊的tab。
2.1 參數(shù)說明
-l: 僅打印需要替換的文件名字,不替換文件內(nèi)容
如下:
-r: 指定替換規(guī)則,格式:-s “pattern -> replacement”
-s:顯式指定需要替換的文件
-w:直接修改目標(biāo)文件,且命令行不打印任何數(shù)據(jù)
idea 自帶,也可以使用下面的語句強(qiáng)行執(zhí)行
一般是對(duì)工程中變量名字的對(duì)齊,比如行開頭統(tǒng)一使用tab
注意:gofmt ≠ 代碼規(guī)范,比如它不會(huì)管單行是否超過了120個(gè)字符
2.2 go fmt
go fmt 是對(duì) gofmt 的簡單封裝,比如一些通用的代碼規(guī)范規(guī)則,我們直接使用go fmt 就可以直接覆蓋了。效果如下:
當(dāng)然,和 gofmt 一樣,go fmt 也不能解決代碼本身的邏輯問題。
三、goimports(比gofmt 更常用)
goimports 是gofmt 的升級(jí)版,相對(duì)gofmt,它不僅可以修復(fù)代碼格式,還可以規(guī)范import 的格式。
比較規(guī)范的import 格式:
import( // 標(biāo)準(zhǔn)包 "log" "json" ... // 內(nèi)部包 "mygoproject/model/..." ... // 第三方包 "github.com/..." )
3.1 安裝
go get golang.org/x/tools/cmd/goimports
3.2 goland 配置
3.3 手動(dòng)格式化代碼/項(xiàng)目
修改某個(gè)文件:
goimports -w filename
修改整個(gè)目錄下的所有代碼:
goimports -w 目錄名
3.4 擴(kuò)展:為什么格式規(guī)范化推薦用 goimports 而不是 go fmt
總結(jié):goimports 也封裝了gofmt 的功能,而且goimports 會(huì)對(duì)無用import 刪除,對(duì)go 自己的包和第三方包 進(jìn)行整理,功能更強(qiáng)大。
四、go vet (靜態(tài)代碼檢查)
前面看到的 gofmt 和 goimports 都不涉及到代碼邏輯的檢查。那么接下來就是 go vet 大展手腳的地方了
4.1 執(zhí)行
掃描單個(gè)文件:
go vet filename.go
掃描整個(gè)項(xiàng)目:
go vet ./…
4.2 可以修復(fù)的問題 4.2.1 語法
比如這里我們使用 go routine 的語法有問題,執(zhí)行 go vet 會(huì)提示:function must be invoked in go statement
4.2.2 循環(huán) 和 goroutine/defer
還是前面的示例,把括號(hào)補(bǔ)充之后,依然會(huì)報(bào)錯(cuò):
loop variable currentFloat captured by func literal
這就是在循環(huán)中使用協(xié)程帶來的問題了。具體原因可以參考這個(gè)問答說明。
循環(huán)中使用 go routine 一定要注意參數(shù)的傳遞方式。正確的使用方式:
4.2.3 其他語法問題
比如永遠(yuǎn)是true/false的表達(dá)式,或者是不可到達(dá)的代碼等。
五、go module
管理項(xiàng)目依賴
專題介紹
六、附錄-其他參考文章
到此這篇關(guān)于golang一些常用的靜態(tài)檢查工具的文章就介紹到這了,更多相關(guān)golang靜態(tài)檢查工具內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang實(shí)現(xiàn)Java虛擬機(jī)之解析class文件詳解
這篇文章主要為大家詳細(xì)介紹了Golang實(shí)現(xiàn)Java虛擬機(jī)之解析class文件的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01Go語言實(shí)現(xiàn)登錄驗(yàn)證代碼案例
這篇文章主要介紹了Go語言實(shí)現(xiàn)登錄驗(yàn)證代碼案例,代碼和圖文講解的很清晰,有感興趣的可以學(xué)習(xí)下2021-03-03golang中set數(shù)據(jù)結(jié)構(gòu)的使用示例
本文主要介紹了golang中set數(shù)據(jù)結(jié)構(gòu)的使用示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03Golang函數(shù)重試機(jī)制實(shí)現(xiàn)代碼
在編寫應(yīng)用程序時(shí),有時(shí)候會(huì)遇到一些短暫的錯(cuò)誤,例如網(wǎng)絡(luò)請(qǐng)求、服務(wù)鏈接終端失敗等,這些錯(cuò)誤可能導(dǎo)致函數(shù)執(zhí)行失敗,這篇文章主要介紹了Golang函數(shù)重試機(jī)制實(shí)現(xiàn)代碼,需要的朋友可以參考下2024-04-04Go 語言下基于Redis分布式鎖的實(shí)現(xiàn)方式
本篇文章將詳細(xì)介紹如何正確地實(shí)現(xiàn)Redis分布式鎖,下面通過一個(gè)項(xiàng)目基于 Redis 的分布式鎖能夠提供哪些分布鎖特性,本文給大家介紹的非常詳細(xì),需要的朋友參考下吧2021-06-06