flagパッケージでコマンドラインフラグが現れたか確認する方法

Go

flagパッケージを使うと、コマンドラインフラグ(オプション)を便利に扱うことができます。

flagパッケージを使っていて、あるフラグがコマンドラインに現れたかどうかを検知したいという状況があったので、方法を調べてみました。

一つ目の方法はコマンドラインの内容を os.Args で直接調べる方法です。ただし、flagパッケージで作られるフラグは、例えば a という名前のフラグならば -a--a という2つの形式がある上に、引数を持つ場合、 -a x-a=x という2つの形式があるため、処理が複雑になってしまうかもしれません。また、osパッケージを使うのはあまりスマートな方法ではないと思います。

二つ目の方法は、フラグのデフォルトの値から変更があるかをチェックする方法です。これが一番普通の方法だと思います。しかし、コマンドラインでデフォルトと同じ値をセットした場合と、コマンドラインにそのフラグが現れていない場合の区別はつきません。

三つ目の方法は、 flag.Visit() という関数を使う方法です。 flagパッケージ内の関数を使って調べるには、これしかないようです。flag.Visit() に渡す関数を定義する必要がありますが、今回の目的には一番あっているようです。

上記の三つの方法を示すコードを作成してみました。
同じような状況があった場合は、この三つの方法をうまく使いわけるといいと思います。

参考文献

  • 「プログラミング言語Go」 Alan A.A. Donovan (著),‎ Brian W. Kernighan (著),‎ 柴田 芳樹 (翻訳)