strchecker——Go源碼字符串規範檢查lint工具

1.背景

在大型項目開發過程中,經常會遇到打印大量日誌,輸出信息和在源碼中寫註釋的情況。對於軟件開發來說,我們一般都是打印輸出英文的日誌(主要考慮軟件在各種環境下的兼容性,如果打印中文日誌可能會出現亂碼,另外英文日誌更容易搜索,更容易後續做國際化),但是對於我們中國人來說,很容易就把中文全角的中文標點符號一不注意就寫到日誌中了。不過源碼中的註釋因爲是完全面向開發者的,不會面向客戶,所以如果研發團隊全是中國人,那麼代碼註釋用中文就更有效率。
在實際開發過程中,確實就發現了打印日誌中包含了中文標點的情況,但是如果我們直接用中文標點在IDE中進行全文搜索,就好發現大量的代碼註釋使用中文標點,而到底哪裏是日誌打印時的中文標點,哪裏是註釋中的中文標點,根本看不出來。於是我參考golangci-lint的代碼掃描檢查功能,寫了一個Go源碼中字符串規範檢查的lint工具:strchecker。源碼放在:https://github.com/studyzy/go-strchecker

2.strchecker介紹

strchecker可以掃描某個文件夾或者該文件夾下的所有子文件夾中的go代碼,並對其中的go代碼進行語法分析,構建語法樹,找到其中申明的常量、變量、函數參數、返回值、賦值、case語句等場景下的字符串string類型,然後對這些字符串進行正則匹配。系統默認的正則匹配方式是隻有ASCII字符纔是合法字符,只要超過一個字節的(比如中文、中文標點等都是多字節的)就會被匹配到,而匹配到的字符串就算是非法字符串,並最終將這些非法字符串打印出來。
下面舉一個示例:
1.安裝strchecker
go install github.com/studyzy/go-strchecker/cmd/strchecker@latest
2.找到我們要進行掃描的文件夾,這裏就以go-strchecker/testdata/ 這個文件夾爲例,進行非法字符串掃描。
strchecker $GOPATH/src/github.com/studyzy/go-strchecker/testdata
3.輸出結果如下:
0 /Users/devinzeng/go/src/github.com/studyzy/go-strchecker/testdata/call.go:9:60 has invalid string: ""
1 /Users/devinzeng/go/src/github.com/studyzy/go-strchecker/testdata/call.go:10:11 has invalid string: "a!b"
2 /Users/devinzeng/go/src/github.com/studyzy/go-strchecker/testdata/call.go:11:5 has invalid string: "aa!"
3 /Users/devinzeng/go/src/github.com/studyzy/go-strchecker/testdata/call.go:12:40 has invalid string: "bb!"
4 /Users/devinzeng/go/src/github.com/studyzy/go-strchecker/testdata/main.go:10:30 has invalid string: "not found!"
5 /Users/devinzeng/go/src/github.com/studyzy/go-strchecker/testdata/main.go:12:17 has invalid string: "no,data!"
6 /Users/devinzeng/go/src/github.com/studyzy/go-strchecker/testdata/main.go:15:14 has invalid string: "Hello,World!"
7 /Users/devinzeng/go/src/github.com/studyzy/go-strchecker/testdata/main.go:16:12 has invalid string: "Current time:"
8 /Users/devinzeng/go/src/github.com/studyzy/go-strchecker/testdata/main.go:19:15 has invalid string: "한국어"
9 /Users/devinzeng/go/src/github.com/studyzy/go-strchecker/testdata/main.go:20:15 has invalid string: "にほんご"
10 /Users/devinzeng/go/src/github.com/studyzy/go-strchecker/testdata/main.go:22:14 has invalid string: ":) 😁😁😁"
如果是在Goland這樣的IDE中的,那麼我們就可以直接點擊源碼路徑,定位到具體的代碼位置了。
5.然後對其中的字符串進行修復,將其中的中文標點替換成英文標點。
6.如果我們有一些特殊的要求,而不是隻允許ASCII碼錶中的內容纔是合法內容,比如我們允許中英文,但是不允許日文、韓文等,那麼怎麼辦?於是我在參數中預置了ASCII表允許和ASCII+中文+中文標點允許這兩種常用的匹配類型。如果我們想允許ASCII和中文,那麼命令是:
strchecker -invalid-type=1 ./testdata/...
【注意:這裏最後的...表示testdata目錄下的所有子文件和子文件夾,會遞歸的掃描,當然因爲我們testdata沒有子文件夾,所以這個...加或者不加都是一樣的。】
輸入結果爲:
0 testdata/main.go:19:15 has invalid string: "한국어"
1 testdata/main.go:20:15 has invalid string: "にほんご"
2 testdata/main.go:22:14 has invalid string: ":) 😁😁😁"

3.結論

strchecker是一個專門用於掃描Golang源碼中字符串是否包含特定正則表達式的Lint工具。使用strchecker可以快速找到Go源碼中字符串中隱藏的中文標點、非中英文字符等,很適合用於國人在大型go項目中掃描日誌輸出或者其他字符串定義時不小心出現的中文標點的情況。

當然,如果本身項目的源碼中連註釋都不允許用中文和中文標點,那麼就直接用IDE的search功能即可,本工具是不掃描源碼中註釋的內容的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章