この記事は『Go2 Advent Calendar 2018』の21日目の記事です。
was updated last. a month ago
Goを書く時に使えそうな便利ツールを調べてみた

この記事は『Go2 Advent Calendar 2018』の21日目の記事です。
昨日は@tooruさんのGoのssa.htmlの変更点まとめ2018でした、お疲れ様です!

この記事のテーマは『Goを書く時に使えそうな便利ツールを調べてみる』です。
普段Goを使って開発する事が多いのですが、新しい便利なツールを見つけたいなと思い、このテーマにしました。

前提

普段はVimを使って、AWS Lambda/GoでのマイクロサービスやGAE/GoでのWebAPI開発をやっています。
vim-goは使っていますが、特に設定もしておらず、デフォルトで使っています。

開発スピードをさらに上げる為に、コーディングや作業をサポートしてくれるツールを見つける事が目的です。

JSON to go-struct

オンラインでできるツールはコチラです。
それとは別でgojsonというCLIツールを見つけました。

curlからパイプできたり、-inputでファイルから読めたりするので便利です。
オプションもいくつかついてるので、困ったら機能足せそうだしオススメです。

$ go get -u github.com/ChimeraCoder/gojson/gojson
$ curl -X https://xxxxxxxxxxx.com | gojson

Golint

Golint

なんとなく使ったり使わなかったりしていたけど、調べてみたらVimでのファイル保存時の実行方法が書いてあったので試してみました。

set rtp+=$GOPATH/src/golang.org/x/lint/misc/vim
autocmd BufWritePost,FileWritePost *.go execute 'Lint' | cwindow

設定して以下のようなコードを書いて保存すると、ちゃんと怒ってくれます。
とは言え、導入されていないプロジェクトを開くと大変な事になりそうです。

Image from Gyazo

Prettybench

Prettybench

testingパッケージによるベンチマークテストの結果を整形してくれます。

package example

func Sum(x, y int) int {
	return x + y
}
package example

import "testing"

func Benchmark_Sum(b *testing.B) {
	for i := 0; i < b.N; i++ {
		Sum(888, 999)
	}
}
$ go test -bench=.
goos: linux
goarch: amd64
Benchmark_Sum-8   	2000000000	         0.26 ns/op
PASS
ok  	_/home/yukpiz/labo/temp/prettybench	0.552s

$ go test -bench=. | prettybench
goos: linux
goarch: amd64
PASS
benchmark               iter    time/iter
---------               ----    ---------
Benchmark_Sum-8   2000000000   0.26 ns/op
ok  	_/home/yukpiz/labo/temp/prettybench	0.544s

benchcmp

benchcmp

go testで出力した複数のベンチマークテスト結果を比較して表示してくれます。
パフォーマンス計測がしやすくて便利ですね!

$ go test -bench . -benchmem > old
$ go test -bench . -benchmem > new
$ benchcmp old new

benchmark            old ns/op     new ns/op     delta
Benchmark_Join-8     682           231           -66.13%

benchmark            old allocs     new allocs     delta
Benchmark_Join-8     13             2              -84.62%

benchmark            old bytes     new bytes     delta
Benchmark_Join-8     128           32            -75.00%

benchviz

benchcmpで出力した結果を、画像にビジュアライズできます。

$ benchcmp old new | benchviz > output.svg

gorename

識別子の命名変更にはgorenameが使えます。

単体で使う場合はコチラ

vim-goで使ってみると凄く便利な事に気付きました。
https://github.com/fatih/vim-go-tutorial#rename-identifiers

godepgraph

依存関係を可視化してくれるツール、このブログを解析させてみました。

$ godepgraph github.com/yukpiz/labo.yukpiz.me/src | dot -Tpng -o test.png

( ゚д゚ )

-novendorをつけると外部依存パッケージは省いてくれるみたいです。

$ godepgraph -novendor github.com/yukpiz/labo.yukpiz.me/src | dot -Tpng -o test.png

いいですね!

goimports

goimports

ずっと使ってはいたのですが、g:go_fmt_command = "goimports"したら幸せになることができました。

まとめ

色々と調べてみると知らなかったツールや知っていても使いこなせていなかった事を学べますね。
という訳で明日は@seike460さんの記事です、お楽しみに!