CUBE SUGAR CONTAINER

技術系のこと書きます。

Golang: gometalinter でソースコードを静的解析しまくる

先日、このブログで Golang の linter を使ってみたエントリを書いた。

blog.amedama.jp

すると @r_rudi さんから gometalinter という便利なものがあることを教えてもらえた。

何それ?

gometalinter は Golang の色々な linter を一度に実行できてしまう優れもの。

インストール

gometalinter は go get コマンドでさくっとインストールする。

$ go get github.com/alecthomas/gometalinter

初期設定

最初に gometalinter に --install と --update オプションをつけて実行する。 これで対応している linter をひと通りインストールしてくれる。

$ gometalinter --install --update
Installing:
  gotype
  aligncheck
  dupl
  interfacer
  golint
  structcheck
  ineffassign
  gosimple
  goimports
  errcheck
  unconvert
  goconst
  varcheck
  deadcode
  gocyclo
  lll

使ってみよう

ツッコミどころのあるソースコードを用意して動作を確認してみよう。

$ cat < 'EOF' > helloworld.go
package main

import (
    "fmt"
)

func main() {
    n := 1 // 使われない変数
    fmt.Println("Hello, World!")
}
EOF

上記のファイルを用意したのと同じディレクトリで gometalinter コマンドを実行する。

$ gometalinter .
helloworld.go:8:2:warning: n assigned and not used (ineffassign)
helloworld.go:8:2:error: n declared but not used (gotype)
helloworld.go:8:2:warning: n declared but not used (interfacer)
helloworld.go:8:2:warning: unused struct field n declared but not used (structcheck)
helloworld.go:8:2:warning: redundant type conversion (unconvert)
helloworld.go:8:2:warning: n declared but not used (aligncheck)

ありとあらゆる linter たちが一斉にソースコードにツッコミを入れてくれた。 指摘内容の右側のカッコに囲まれているのが、それを指摘した linter の名前になっている。

まとめ

  • gometalinter を使うと Golang の様々な linter を一度に実行できる

べんり。