企業内においてGoを利用するケースが増えています。コンパイル系であり静的型付けの言語で、実行速度も速いのが特徴です。さらに仕様がシンプルなので習得が容易、かつ書かれたプログラムはマルチプラットフォームで動作します。
人気が出るに従ってチームでGoプロジェクトを進めるケースも多くなるでしょう。そうした中でコードの品質を保ち、保守性を良くするために、ソフトウェアを使ってコードをチェックしましょう。。幾つかのソフトウェアがありますが、今回はGoに標準で組み込まれているgo vetを紹介します。
go vetの使い方
go vetは go tool vet [directory]
といった指定方法で実行します。directory
はGoのソースコードが入ったディレクトリを指定します。
$ go tool vet path/to/go/project
実行すると、問題のある箇所について指摘が出力されます。
$ go tool vet ./alecthomas/gometalinter/ adjcmartix.go:85: suspect or: char != "" || char != " " main.go:55: arg usage in Fprint call is a function value, not a function call resolve.go:161: unreachable code sparse.go:58: _m might be too small for shift of 32
後はこの指摘事項に沿ってソースコードを修正していくだけです。
ヘルプ
go vet のヘルプは go doc cmd/vet
で出力できます。
$ go doc cmd/vet Vet examines Go source code and reports suspicious constructs, such as Printf calls whose arguments do not align with the format string. Vet uses heuristics that do not guarantee all reports are genuine problems, but it can find errors not caught by the compilers. It can be invoked three ways: By package, from the go tool: go vet package/path/name vets the package whose path is provided. By files: go tool vet source/directory/*.go :
オプションについて
解析する項目をオプションで指定できます。デフォルトでは -all
が指定されており、すべての項目をチェックを実行してくれます。例えば、到達しないコードのみを見つける場合は -unreachable
を使います。
$ go tool vet -unreachable ./alecthomas/ alecthomas/gometalinter/_linters/src/golang.org/x/text/unicode/cldr/resolve.go:161: unreachable code alecthomas/gometalinter/vendor/gopkg.in/yaml.v2/decode.go:123: unreachable code
他にポインタを数値に変換する際に unsafe.Pointer
を使っていると警告を出せる -unsafeptr
オプションがあります。
$ go tool vet -unsafeptr ./alecthomas/ alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/interp/external.go:302: possible misuse of unsafe.Pointer // コードは次のようになっています if pc != 0 { fn = (*ssa.Function)(unsafe.Pointer(pc)) // indeed unsafe! }
基本的にはすべての項目をチェックで良いと思いますが、必要に応じてフラグを指定して、必要な種類の項目・解析のみを実行してください。
go vet は標準的な、これまでの経験上問題と推測される点を指摘します。つまり指摘事項が必ずしも問題とは限りません。とは言えコンパイラでは問題がない内容でも指摘してくれるでしょう。内容に沿って修正することで、分かりやすいコードに仕上げられるでしょう。
Go言語用のコード解析ツールはCPUリソースを多く消費するものが多くあります。そのため、ローカルのPCで実行するには時間がかかってしまって煩わしく感じることがあるかもしれません。そんな際にはGitHubでPull Requestと連携してGo言語用解析ツールを実行する、コードレビューの自動化用のCIサービスであるSideCIがお役に立てると思います。SideCIはgo vetにも対応しています。無料トライアルがありますので、まずはお試しください。