Golang代码检查工具

1. Golint

(1)安装golint

git clone https://github.com/golang/lint.git 
cd lint/golint
go install

(2)使用方式

# 检查单个文件
golint service.go
 
# 检查当前目录所有.go文件,不会递归查找
golint

(3)golint校验规则

  • 不能使用下划线命名法,使用驼峰命名法
  • 外部可见程序结构体、变量、函数都需要注释
  • 通用名词要求大写 iD/Id -> ID Http -> HTTP Json -> JSON Url -> URL Ip -> IP Sql -> SQL
  • 包命名统一小写不使用驼峰和下划线
  • 注释第一个单词要求是注释程序主体的名称,注释可选不是必须的
  • 外部可见程序实体不建议再加包名前缀
  • if语句包含return时,后续代码不能包含在else里面
  • errors.New(fmt.Sprintf(…)) 建议写成 fmt.Errorf(…)
  • receiver名称不能为this或self
  • receiver名称不能为this或self
  • 错误变量命名需以 Err/err 开头
  • a+=1应该改成a++,a-=1应该改成a--

(4)检查的结果示例如下:

middlewares.go:29:6: exported type xxxInstrumentingMiddleware should have comment or be unexported
middlewares.go:41:1: error should be the last type when returning multiple items
middlewares.go:41:1: exported method xxxInstrumentingMiddleware.Creativexxx should have comment or be unexported
middlewares.go:88:1: error should be the last type when returning multiple items
middlewares.go:88:1: exported method xxxInstrumentingMiddleware.CreativexxxRTB should have comment or be unexported
middlewares.go:135:1: error should be the last type when returning multiple items
middlewares.go:135:1: exported method xxxInstrumentingMiddleware.UpdateConf should have comment or be unexported
middlewares.go:141:1: error should be the last type when returning multiple items
middlewares.go:141:1: exported method xxxInstrumentingMiddleware.GetConf should have comment or be unexported
middlewares.go:147:1: exported function NewWrappedxxxInstrumentingMiddleware should have comment or be unexported
middlewares.go:218:6: exported type xxxInstrumentingMiddleware should have comment or be unexported
middlewares.go:225:1: exported method xxxInstrumentingMiddleware.PredictGRPC should have comment or be unexported
middlewares.go:250:1: exported function NewxxxInstrumentingMiddleware should have comment or be unexported
middlewares.go:281:6: exported type xxxxxxInstrumentingMiddleware should have comment or be unexported
middlewares.go:288:1: exported method xxxxxxInstrumentingMiddleware.PredictGRPC should have comment or be unexported
middlewares.go:288:116: method parameter appId should be appID
middlewares.go:306:1: exported function NewxxxxxxInstrumentingMiddleware should have comment or be unexported
xxx_callee.go:1:1: package comment should be of the form "Package xxxservice ..."
xxx_callee.go:1:1: package comment should not have leading space
xxx_callee.go:1:1: package comment should be of the form "Package xxxservice ..."
xxx_callee.go:1:1: package comment should not have leading space
xxx_callee.go:1:1: package comment should be of the form "Package xxxservice ..."
xxx_callee.go:1:1: package comment should not have leading space
xxx_callee.go:38:96: method parameter appId should be appID
service.go:124:5: exported const xxxLevelLowerLimit should have comment (or a comment on this block) or be unexported
service.go:134:6: exported type xxxTdbankConfig should have comment or be unexported
service.go:138:6: exported type xxxConfig should have comment or be unexported
service.go:152:6: exported type xxxResponse should have comment or be unexported
service.go:162:6: exported type xxxMetaDataCache should have comment or be unexported
service.go:515:1: error should be the last type when returning multiple items
service.go:592:9: range var appId should be appID
service.go:604:16: range var appIdStr should be appIDStr
service.go:609:17: var appId should be appID
service.go:688:13: range var appId should be appID
service.go:801:13: range var appId should be appID
service.go:806:13: var behaviorGameIdList should be behaviorGameIDList

IDE集成工具参考:https://blog.csdn.net/qq_38712932/article/details/108108784

2. Golangci-lint

(1)安装golangci-lint

curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.41.1
golangci-lint --version

(2)使用方式

# 检查单个文件
golangci-lint run service.go
 
# 指定目录
golangci-lint run internal/
 
# 检查当前目录所有.go文件,会递归查找当前目录及子目录
golangci-lint run

(3)golangci-lint校验规则

golangci-lint运行时会在当前目录查找配置文件

  • golangci.yml
  • .golangci.yaml
  • .golangci.toml
  • .golangci.json

具体配置参考:

https://golangci-lint.run/usage/configuration/

(4)检查的结果示例如下,-v参数可以看到更详细的检查结果

# golangci-lint run -v service/service.go
INFO [config_reader] Config search paths: [./ /data/xxx/code/xxx/internal/xxx/service /data/xxx/code/xxx/internal/xxx /data/xxx/code/xxx/internal /data/xxx/code/xxx /data/xxx/code /data/xxx /data / /root]
INFO [lintersdb] Active 10 linters: [deadcode errcheck gosimple govet ineffassign staticcheck structcheck typecheck unused varcheck]
INFO [loader] Go packages loading at mode 575 (compiled_files|exports_file|name|types_sizes|deps|files|imports) took 448.248885ms
INFO [runner/filename_unadjuster] Pre-built 0 adjustments in 7.130535ms
INFO [linters context/goanalysis] analyzers took 4.744573ms with top 10 stages: buildir: 629.354µs, fact_deprecated: 514.772µs, inspect: 435.291µs, ctrlflow: 362.378µs, typedness: 353.563µs, printf: 345.2µs, SA5012: 345.028µs, fact_purity: 333.959µs, nilness: 333.457µs, isgenerated: 28.152µs
INFO [runner/max_same_issues] 1/4 issues with text "undeclared name: `ModelInstrumentingMiddleware`" were hidden, use --max-same-issues
INFO [runner/max_same_issues] 1/4 issues with text "undeclared name: `NewModelInstrumentingMiddleware`" were hidden, use --max-same-issues
INFO [runner] Issues before processing: 2608, after processing: 9
INFO [runner] Processors filtering stat (out/in): skip_files: 2608/2608, max_from_linter: 9/9, path_shortener: 9/9, path_prefixer: 9/9, skip_dirs: 2608/2608, identifier_marker: 2608/2608, exclude: 2608/2608, nolint: 2608/2608, diff: 11/11, max_per_file_from_linter: 11/11, severity-rules: 9/9, sort_results: 9/9, filename_unadjuster: 2608/2608, path_prettifier: 2608/2608, autogenerated_exclude: 2608/2608, exclude-rules: 2608/2608, source_code: 9/9, cgo: 2608/2608, uniq_by_line: 11/2608, max_same_issues: 9/11
INFO [runner] processing took 103.631607ms with stages: exclude-rules: 61.093674ms, identifier_marker: 32.814984ms, nolint: 7.481643ms, path_prettifier: 1.299346ms, skip_dirs: 217.899µs, uniq_by_line: 187.231µs, source_code: 145.003µs, filename_unadjuster: 132.84µs, cgo: 117.621µs, autogenerated_exclude: 93.646µs, max_same_issues: 37.831µs, path_shortener: 2.715µs, max_from_linter: 2.375µs, max_per_file_from_linter: 1.845µs, exclude: 621ns, severity-rules: 511ns, sort_results: 490ns, skip_files: 471ns, diff: 470ns, path_prefixer: 391ns
INFO [runner] linters took 434.383892ms with stages: goanalysis_metalinter: 330.666778ms
service/service.go:72:29: undeclared name: `ModelInstrumentingMiddleware` (typecheck)
    xxxService            *ModelInstrumentingMiddleware
                            ^
service/service.go:73:29: undeclared name: `ModelInstrumentingMiddleware` (typecheck)
    xxxCalibrationService *ModelInstrumentingMiddleware
                            ^
service/service.go:74:29: undeclared name: `ModelInstrumentingMiddleware` (typecheck)
    xxxCalibrationService *ModelInstrumentingMiddleware
                            ^
service/service.go:76:29: undeclared name: `xxxModelInstrumentingMiddleware` (typecheck)
    xxxService             *xxxModelInstrumentingMiddleware
                            ^
service/service.go:412:33: undeclared name: `NewModelInstrumentingMiddleware` (typecheck)
        xxxService:            NewModelInstrumentingMiddleware(NewxxxService(logger), "xxx_MODEL"),
                                ^
service/service.go:413:33: undeclared name: `NewModelInstrumentingMiddleware` (typecheck)
        xxxCalibrationService: NewModelInstrumentingMiddleware(NewxxxCalibrationService(logger), "xxx_CALIBRATION_MODEL"),
                                ^
service/service.go:414:33: undeclared name: `NewModelInstrumentingMiddleware` (typecheck)
        xxxService:            NewModelInstrumentingMiddleware(NewxxxService(logger), "xxx_MODEL"),
                                ^
service/service.go:416:33: undeclared name: `NewxxxModelInstrumentingMiddleware` (typecheck)
        xxxService:             NewxxxModelInstrumentingMiddleware(NewxxxService(logger), "xxx_MODEL"),
                                ^
service/service.go:448:17: undeclared name: `NewWrappedxxxInstrumentingMiddleware` (typecheck)
    wapedSvc := NewWrappedxxxInstrumentingMiddleware(svc)
                ^
INFO File cache stats: 1 entries of total size 183.6KiB
INFO Memory: 10 samples, avg is 70.1MB, max is 128.1MB
INFO Execution took 893.716ms

3. Go-reporter

github地址:https://github.com/qax-os/goreporter

1)安装codestyle

# golang版本需要 >=1.6
yum -y install graphviz
go get -u github.com/360EntSecGroup-Skylar/goreporter

(2)使用方式

# 展示指令可用参数
goreporter -p [projectRelativePath] -r [reportPath] -e [exceptPackagesName] -f [json/html/text]  {-t templatePathIfHtml}
 
-version Version of GoReporter.
-p Must be a valid Golang project path.
-r Save the path to the report.
-e Exceptional packages (multiple separated by commas, for example: "linters/aligncheck,linters/cyclo" ).
-f report format json, html OR text.
-t Template path,if not specified, the default template will be used.
By default, the default template is used to generate reports in html format.
本站文章资源均来源自网络,除非特别声明,否则均不代表站方观点,并仅供查阅,不作为任何参考依据!
如有侵权请及时跟我们联系,本站将及时删除!
如遇版权问题,请查看 本站版权声明
THE END
分享
二维码
海报
Golang代码检查工具
IDE集成工具参考:https://blog.csdn.net/qq_38712932/article/details/108108784
<<上一篇
下一篇>>