Theories of Pleiades

技術の話とかイベントに行った話とか思ったこととか

Golangのflagパッケージを使ってみる

TL;dr

flagパッケージがめっちゃ便利

何をしたかったのか

GoのSlackAPIライブラリのexampleコードを読んでいたら

var (
    verificationToken string
)

    flag.StringVar(&verificationToken, "token", "YOUR_VERIFICATION_TOKEN_HERE", "Your Slash Verification Token")
flag.Parse()

という記述を見つけた。

github.com


flagパッケージ知らなかったので調べてみました。


flagパッケージ

golang.jp

Goは日本語ドキュメントがわかりやすくて親切だな〜〜〜〜〜〜!!!!!!(大の字)


フラグっていうのはCLIでコマンドの後に付けるオプションのこと,

$ rm -rf ./*

この-rfをフラグと言います(初めて知った)。


flagパッケージを使うとこのフラグの処理がめっちゃ簡単にできる。

String()とかInt()とかいろんな型のフラグを受け付けるためのメソッドがあり,また受け付けたフラグを変数に格納したいときはStringVar()みたいに後ろにVarというキーワードを付けたメソッドを使う。

flag.Int("hoge", 1000, "this is help message")

とした場合,

$ go run flag.go --hoge=2000

という感じでフラグ引数を取れるようになる。

フラグの指定方法は

-flag

-flag=x

-flag x // 非論理値型フラグのみ

らしい(http://golang.jp/pkg/flag より)。

ハイフンは1つでも2つでも大丈夫。

このとき,メソッドの引数として指定した1000がフラグのデフォルト値(何もフラグが与えられなかった場合の値)となる。

flag.Usageでメソッドの第3引数に指定したヘルプメッセージを出力する。


StringVar()メソッドのようにVarのついたメソッドでは,第1引数にバインド先の変数のポインタを渡す。

flag.StringVar(&str, "fuga", "default", "this is help message")

こんな感じになる。


このように全てのフラグについて定義した後,flag.Parse()を呼び出すと与えられたコマンドが解釈される。


実際の動作はこんな感じ。

f:id:mwc922_hsm:20190217011312j:plain
フラグ入力があった場合

f:id:mwc922_hsm:20190217011316j:plain
フラグ入力無し

まとめ

flagパッケージ便利です。使っていきたい。

ちなみにPythonだと同じようなことをするのにargparseRubyだとoptparseというパッケージがあるらしい。

でもGoが一番簡潔に書けそうだし本質にフォーカスしてる感じがする。うれしい。


参考

python - Add command line arguments with flags in Python3 - Stack Overflow

Ruby の OptionParser チートシート - Qiita