ReadMeFirst
- go vetとは
goの標準パッケージに含まれるコードの静的解析ツールです。
公式documentはこちら
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.
VetはGoのソースコードを検証し、疑わしいコードを報告してくれます。例えば、Printfの呼び出しにおいて、引数とフォーマットが間違っているだとか。
Vetは、全ての報告が本当に問題かを保証しない。しかしコンパイルでは見つけられないエラーを見つけることができます。
原文をぽく直訳すると、 ちょっと難しくてヨクワカンネ
感あるんですが。
ワタシ、ソンナ、エイゴ、トクイデナイ
要するに
本当に問題になるかは分からないし、ビルドは通せるんだけど、こういう懸念があるかもね
的な問題を
コンパイラとは別の観点でチェックしサジェストをしてくれる、賢い子です。
原文では
Note that the tool does not check every possible problem and depends on unreliable heuristics
so it should be used as guidance only, not as a firm indicator of program correctness
vetは、全ての問題をチェックするわけではないし、経験則みたいな信頼性の低い物に依存してるから
あくまでガイダンス的な使い方をするのが正しくて、プログラムが正しいかどうかの指標にはしないでね。
と書いてありますが、
これは明らかにエラーでしょ
と言うわけではないけど こういう問題でない?大丈夫?
レベルでも
情報としてはありがたい物で実行してみて損はないと思います。適用の有無は自身ないしチームで定めればよいので。
go vetの使用方法・flagなど
と言うことで使い方です。
go vet package/path/name # package単位
go tool vet /path/to/*.go # file単位
go tool vet /path/to/directory # directory単位
go doc cmd/vet
でdocumentも見れます。
defaultで -allが有効なので、一部の意図的にdisabledな物(shadowとか)を除いては
特に指定しなくても検知可能です。
go vetが検知してくれた例
- Unreachable code
- Shadowed variables
- bad syntax for struct tag value
- no args in Error Call
- Mutex Lock
- UnSafePointer
ロジック上絶対たどり着かないコードがあるよ、とか、引数に明示的にnil渡せと言う細いものから、JsonやXormなど構造体のプロパティをタグ付けしてる場合に
教えてくれたりする、コンパイルでは気づけないけど、実行コケるのでいい子もあったり。
Mutexまわりなど普段意識することないところもあると思うので良いと思います。
まとめ
vetのsuggestする内容は、一部別に、そこまでせんでもええんちゃう?(No Args In Error Call)とか。
みたいなところとかはあるんですが。
使って損はない機能だと思いますし、フラグでカスタマイズしてcommit-hook、CI、reviewBotの検証項目に追加してもよいのかなと。
自分のコードに是非一度かけてみてください