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()
という記述を見つけた。
flagパッケージ知らなかったので調べてみました。
flagパッケージ
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()
を呼び出すと与えられたコマンドが解釈される。
実際の動作はこんな感じ。
まとめ
flagパッケージ便利です。使っていきたい。
ちなみにPythonだと同じようなことをするのにargparse
,Rubyだとoptparse
というパッケージがあるらしい。
でもGoが一番簡潔に書けそうだし本質にフォーカスしてる感じがする。うれしい。
参考
python - Add command line arguments with flags in Python3 - Stack Overflow