詩と創作・思索のひろば

ドキドキギュンギュンダイアリーです!!!

Fork me on GitHub

Goのswitch文を生成するツール

GitHub - motemen/go-switchgen

昔作ったソフトウェアをちょっとメンテしたシリーズ。Go で switch 文を自動生成したいよーってときに使えるやつです。 case 文が exhaustive になるようにいちいち書いてくのが面倒なので、機械にやらせる。

こんなやつ欲しいんだが……ってなったときに、オレならこういう名前のツールを作る! って思った名前で過去の自分が作ってることに一貫性を感じる。まあ世の中にすでに3つくらい実装のありそうなやつではある。

% go install github.com/motemen/go-switchgen/cmd/goswitchgen@latest

使い方

fully-qualified な型を指定すると、その型を持つ値に対する switch 文を生成します。case に挙げられるのは、同じパッケージに定義されている値や型。

% goswitchgen <package>.<type>

reflect.Kind みたいに enum っぽい定数なら、

% goswitchgen reflect.Kind
switch _ {
case reflect.Array:
case reflect.Bool:
[...]
case reflect.Uintptr:
case reflect.UnsafePointer:
}

みたいに生成してくれる。

go/ast.Node みたいなインタフェースの場合は型switchを生成してくれる。インタフェースを実装する型の一覧は go doc からわかんないので便利ですね。

% goswitchgen go/ast.Node
switch _.(type) {
case *ast.ArrayType:
case *ast.AssignStmt:
[...]
case *ast.UnaryExpr:
case *ast.ValueSpec:
}

となります。

go.mod に挙げられていれば、標準モジュール以外についても switch 文を生成できます。

% cat go.mod | grep github.com/slack-go/slack
    github.com/slack-go/slack v0.8.2
% goswitchgen github.com/slack-go/slack.MessageBlockType
switch _ {
case slack.MBTAction:
[...]
case slack.MBTSection:
}

今回、x/tools/go/packages を使ったんだけどすでに Go の関数を context 対応するツール - 詩と創作・思索のひろば で書いてた。いろいろ文脈のあるモジュールのようなので、いつかまとめたい。

はてなで一緒に働きませんか?