前日のエントリではos.Args
を用いてコマンドラインのパラメータを取り扱いました。
これ以外にも、Go言語ではflag
パッケージというものが用意されています。
コマンドラインで与えられたパラメータのパース処理を簡単に実施できるようになっています。
本エントリでは、flag
パッケージを利用したコマンドラインパラメータの基本的な取扱い方について確認してみます。
サンプルコマンドの仕様
本エントリで作成するコマンドの仕様は以下の通りとします
samplecmd.exe -m <メッセージ> -n <カウント>
または
samplecmd.exe -m <メッセージ> -n <カウント> -debug
で実行できる。
-debug
を指定した場合にdebug=trueとなり、指定しない場合はdebug=false- <カウント>は0以上の値
上記コマンドをflag
パッケージを使って2パターンで処理してみます
パターン1
string型で取り扱うパラメータに対して、flag.String(<パラメータ名>, <デフォルト値>, <パラメータの説明>)
でパラメータの値を格納する変数のポインタを取得します。
uint型のパラメータではflag.Uint
, bool値にいてはflag.Bool
を利用して変数を宣言します。
各変数が宣言されたあとに、flag.Parse
を実行することでコマンドラインのパラメータがパースされ、各変数に値が格納されます
■サンプルコード
変数の宣言とパラメータの取り扱い方を同時に定義するようなイメージになります
package main import ( "flag" "fmt" ) func main() { var ( msg = flag.String("m", "default message.", "Message") num = flag.Uint("n", 0, "Count(>= 0)") debug = flag.Bool("debug", false, "Debug Mode enabled?") ) flag.Parse() fmt.Printf("param -m -> %s\n", *msg) fmt.Printf("param -n -> %d\n", *num) fmt.Printf("param -debug -> %t\n", *debug) }
■実行結果
C:\go_tmp\samplecmd.exe -m Hello -n 100 param -m -> Hello param -n -> 100 param -debug -> false
<パラメータ名>=<値>の指定も可能
C:\go_tmp\samplecmd.exe -m "Hello World" -debug -n=123 param -m -> Hello World param -n -> 123 param -debug -> true
パターン2
パターン1と大きな差はありませんが、以下のような流れで処理します
パラメータの値を格納する変数を宣言します。
↓
string型で取り扱うパラメータに対して、flag.StringVar(<値を格納する変数のアドレス>, <パラメータ名>, <デフォルト値>, <パラメータの説明>)
を実行します。
uint型のパラメータではflag.UintVar
, bool値にいてはflag.BoolVar
を利用します。
↓
その後に、flag.Parse
を実行することでコマンドラインのパラメータがパースされ、各変数に値が格納されます
■サンプルコード
パラメータの値を格納する変数の宣言とパラメータの取り扱い方を別々に定義するようなイメージになります
package main import ( "flag" "fmt" ) func main() { var ( msg string num uint debug bool ) flag.StringVar(&msg, "m", "default message.", "Message") flag.UintVar(&num, "n", 0, "Count(>= 0)") flag.BoolVar(&debug, "debug", false, "Debug Mode enabled?") flag.Parse() fmt.Printf("param -m -> %s\n", msg) fmt.Printf("param -n -> %d\n", num) fmt.Printf("param -debug -> %t\n", debug) }
■実行結果
C:\go_tmp\samplecmd.exe -m sample_message -n 1 param -m -> sample_message param -n -> 1 param -debug -> false
<パラメータ名>=<値>の指定も可能
C:\go_tmp\samplecmd.exe -m=sample_message2 -n 2 -debug param -m -> sample_message2 param -n -> 2 param -debug -> true
ヘルプを表示する
<コマンド> -h
または コマンド -help
を実行するとコマンドのヘルプ(Usage)が表示されます
■実行結果
C:\go_tmp\samplecmd.exe -h Usage of samplecmd.exe: -debug Debug Mode enabled? -m string Message (default "default message.") -n uint Count(>= 0)
間違った値を指定するとUsageが表示される
flag
パッケージを使ってコマンドラインパラメータを処理する場合、コマンドラインで間違ったパラメータを指定するとusage(使い方が表示されます)
存在しないパラメータ名(-c)を指定した場合
■実行結果
C:\go_tmp\samplecmd.exe -m something -c 10 flag provided but not defined: -c Usage of samplecmd.exe: -debug Debug Mode enabled? -m string Message (default "default message.") -n uint Count(>= 0)
パラメータの型に合わない値(-n にマイナス値)を指定した場合
■実行結果
C:\go_tmp\samplecmd.exe -m something -n -10 invalid value "-10" for flag -n: strconv.ParseUint: parsing "-10": invalid syntax Usage of samplecmd.exe: -debug Debug Mode enabled? -m string Message (default "default message.") -n uint Count(>= 0)
デフォルト値の利用
パラメータに値を指定しない場合はデフォルト値が利用されます。
以下例では、-m を省略しているので、デフォルト値(default message.)が変数に格納されている
■実行結果
C:\go_tmp\samplecmd.exe -m something -n 10 param -m -> default message. param -n -> 10 param -debug -> false