Go源碼字符串規(guī)范檢查lint工具strchecker使用詳解
1.背景
在大型項(xiàng)目開發(fā)過程中,經(jīng)常會(huì)遇到打印大量日志,輸出信息和在源碼中寫注釋的情況。對(duì)于軟件開發(fā)來說,我們一般都是打印輸出英文的日志(主要考慮軟件在各種環(huán)境下的兼容性,如果打印中文日志可能會(huì)出現(xiàn)亂碼,另外英文日志更容易搜索,更容易后續(xù)做國(guó)際化),但是對(duì)于我們中國(guó)人來說,很容易就把中文全角的中文標(biāo)點(diǎn)符號(hào)一不注意就寫到日志中了。不過源碼中的注釋因?yàn)槭峭耆嫦蜷_發(fā)者的,不會(huì)面向客戶,所以如果研發(fā)團(tuán)隊(duì)全是中國(guó)人,那么代碼注釋用中文就更有效率。
在實(shí)際開發(fā)過程中,確實(shí)就發(fā)現(xiàn)了打印日志中包含了中文標(biāo)點(diǎn)的情況,但是如果我們直接用中文標(biāo)點(diǎn)在IDE中進(jìn)行全文搜索,就好發(fā)現(xiàn)大量的代碼注釋使用中文標(biāo)點(diǎn),而到底哪里是日志打印時(shí)的中文標(biāo)點(diǎn),哪里是注釋中的中文標(biāo)點(diǎn),根本看不出來。于是我參考golangci-lint的代碼掃描檢查功能,寫了一個(gè)Go源碼中字符串規(guī)范檢查的lint工具:strchecker。源碼放在:https://github.com/studyzy/go-strchecker
2.strchecker介紹
strchecker可以掃描某個(gè)文件夾或者該文件夾下的所有子文件夾中的go代碼,并對(duì)其中的go代碼進(jìn)行語(yǔ)法分析,構(gòu)建語(yǔ)法樹,找到其中申明的常量、變量、函數(shù)參數(shù)、返回值、賦值、case語(yǔ)句等場(chǎng)景下的字符串string類型,然后對(duì)這些字符串進(jìn)行正則匹配。系統(tǒng)默認(rèn)的正則匹配方式是只有ASCII字符才是合法字符,只要超過一個(gè)字節(jié)的(比如中文、中文標(biāo)點(diǎn)等都是多字節(jié)的)就會(huì)被匹配到,而匹配到的字符串就算是非法字符串,并最終將這些非法字符串打印出來。
下面舉一個(gè)示例:
1.安裝strchecker
go install github.com/studyzy/go-strchecker/cmd/strchecker@latest
2.找到我們要進(jìn)行掃描的文件夾,這里就以go-strchecker/testdata/ 這個(gè)文件夾為例,進(jìn)行非法字符串掃描。
strchecker $GOPATH/src/github.com/studyzy/go-strchecker/testdata
3.輸出結(jié)果如下:
/Users/devinzeng/go/src/github.com/studyzy/go-strchecker/testdata/call.go:9:60 has invalid string: "!"
/Users/devinzeng/go/src/github.com/studyzy/go-strchecker/testdata/call.go:10:11 has invalid string: "a!b"
/Users/devinzeng/go/src/github.com/studyzy/go-strchecker/testdata/call.go:11:5 has invalid string: "aa!"
/Users/devinzeng/go/src/github.com/studyzy/go-strchecker/testdata/call.go:12:40 has invalid string: "bb!"
/Users/devinzeng/go/src/github.com/studyzy/go-strchecker/testdata/main.go:10:30 has invalid string: "not found!"
/Users/devinzeng/go/src/github.com/studyzy/go-strchecker/testdata/main.go:12:17 has invalid string: "no,data!"
/Users/devinzeng/go/src/github.com/studyzy/go-strchecker/testdata/main.go:15:14 has invalid string: "Hello,World!"
/Users/devinzeng/go/src/github.com/studyzy/go-strchecker/testdata/main.go:16:12 has invalid string: "Current time:"
/Users/devinzeng/go/src/github.com/studyzy/go-strchecker/testdata/main.go:19:15 has invalid string: "???"
/Users/devinzeng/go/src/github.com/studyzy/go-strchecker/testdata/main.go:20:15 has invalid string: "にほんご"
/Users/devinzeng/go/src/github.com/studyzy/go-strchecker/testdata/main.go:22:14 has invalid string: ":) ??????"
如果是在Goland這樣的IDE中的,那么我們就可以直接點(diǎn)擊源碼路徑,定位到具體的代碼位置了。
5.然后對(duì)其中的字符串進(jìn)行修復(fù),將其中的中文標(biāo)點(diǎn)替換成英文標(biāo)點(diǎn)。
6.如果我們有一些特殊的要求,而不是只允許ASCII碼表中的內(nèi)容才是合法內(nèi)容,比如我們?cè)试S中英文,但是不允許日文、韓文等,那么怎么辦?于是我在參數(shù)中預(yù)置了ASCII表允許和ASCII+中文+中文標(biāo)點(diǎn)允許這兩種常用的匹配類型。如果我們想允許ASCII和中文,那么命令是:
strchecker -invalid-type=1 ./testdata/...
【注意:這里最后的...表示testdata目錄下的所有子文件和子文件夾,會(huì)遞歸的掃描,當(dāng)然因?yàn)槲覀僼estdata沒有子文件夾,所以這個(gè)...加或者不加都是一樣的?!?/p>
輸入結(jié)果為:
testdata/main.go:19:15 has invalid string: "???"
testdata/main.go:20:15 has invalid string: "にほんご"
testdata/main.go:22:14 has invalid string: ":) ????"
3.結(jié)論
strchecker是一個(gè)專門用于掃描Golang源碼中字符串是否包含特定正則表達(dá)式的Lint工具。使用strchecker可以快速找到Go源碼中字符串中隱藏的中文標(biāo)點(diǎn)、非中英文字符等,很適合用于國(guó)人在大型go項(xiàng)目中掃描日志輸出或者其他字符串定義時(shí)不小心出現(xiàn)的中文標(biāo)點(diǎn)的情況。
當(dāng)然,如果本身項(xiàng)目的源碼中連注釋都不允許用中文和中文標(biāo)點(diǎn),那么就直接用IDE的search功能即可,本工具是不掃描源碼中注釋的內(nèi)容的。
以上就是Go源碼字符串規(guī)范檢查lint工具strchecker使用詳解的內(nèi)容,更多關(guān)于Go源碼規(guī)范檢查lint工具strchecker的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
golang變量uint、int大小溢出后的結(jié)果方式
在Go語(yǔ)言中,變量的大小溢出后,`uint`類型會(huì)回繞到最小值,而`int`類型會(huì)回繞到最大值的相反數(shù),例如,`uint8`溢出后會(huì)變成0,`int64`溢出后會(huì)變成最小的負(fù)數(shù)2024-12-12
在Go語(yǔ)言中實(shí)現(xiàn)DDD領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)實(shí)例探究
本文將詳細(xì)探討在Go項(xiàng)目中實(shí)現(xiàn)DDD的核心概念、實(shí)踐方法和實(shí)例代碼,包括定義領(lǐng)域模型、創(chuàng)建倉(cāng)庫(kù)、實(shí)現(xiàn)服務(wù)層和應(yīng)用層,旨在提供一份全面的Go DDD實(shí)施指南2024-01-01
Go語(yǔ)言變量與基礎(chǔ)數(shù)據(jù)類型詳情
Go 是靜態(tài)(編譯型)語(yǔ)言,是區(qū)別于解釋型語(yǔ)言的弱類型語(yǔ)言(靜態(tài):類型固定,強(qiáng)類型:不同類型不允許直接運(yùn)算),下面文章將對(duì)其進(jìn)行詳細(xì)介紹,需要的朋友可以參考一下2021-09-09
Go語(yǔ)言的匿名字段實(shí)現(xiàn)組合復(fù)用實(shí)例探究
這篇文章主要為大家介紹了Go語(yǔ)言的匿名字段實(shí)現(xiàn)組合復(fù)用實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01

