コマンドライン引数はosパッケージのArgs変数で利用できます。
os.Argsはstring型のスライスで定義されており、コマンドパラメータが代入されます。
package main import ( "fmt" "os" ) func main() { // 引数の数を確認する。 if len(os.Args) < 2 { fmt.Println("ERROR: 引数を指定してください。") os.Exit(1) } // os.Argsを確認する。 fmt.Println(os.Args) // 個別引数へのアクセス。 fmt.Printf("実行ファイル名: %s\n", os.Args[0]) for i := 1; i < len(os.Args); i++ { fmt.Printf("引数%d: %s\n", i, os.Args[i]) } }
コマンドオプションを指定するといった複雑な処理を行う場合はflagパッケージを使用します。
flag.Intは、Int型の値をとるオプションを定義するflagパッケージの関数です。
package main import ( "flag" "fmt" ) func main() { var intOpt = flag.Int("n", 0, "Specify the number.") // 解析のために必ずパースを実行する。 flag.Parse() // オプションで指定された値を取り出す。 fmt.Printf("n = %d\n", *intOpt) }
実行結果は以下の通りです。
$ main.exe n = 0 $ main.exe -n 3 n = 3 $ main.exe -n 18 n = 18
helpオプション「-h/-help」を指定すると、Usageメッセージが表示されます。
$ main.exe -h Usage of main.exe: -n int Specify the number.
flag.Stringは、String型の値をとるオプションを定義するflagパッケージの関数です。
使い方はflag.Int()と同じです。以下ではオプションを併用しています。
package main import ( "flag" "fmt" ) var ( intOpt = flag.Int("n", 0, "help message for n option") strOpt = flag.String("s", "", "help message for s option") ) func main() { flag.Parse() fmt.Printf("n = %d\n", *intOpt) fmt.Printf("s = %s\n", *strOpt) }
実行例は以下の通りです。helpオプションも自動で設定されています。
$ main.exe n = 0 s = $ main.exe -s "The Go Programming Language" n = 0 s = The Go Programming Language $ main.exe -s "The Go Programming Language" -n 7 n = 7 s = The Go Programming Language
flag.Arg()やflag.Args()でフラグでないコマンドライン引数へアクセスできます。
package main import ( "flag" "fmt" ) var ( intOpt = flag.Int("n", 0, "help message for n option") strOpt = flag.String("s", "", "help message for s option") ) func main() { flag.Parse() fmt.Printf("n = %d\n", *intOpt) fmt.Printf("s = %s\n", *strOpt) // フラグでないコマンドライン引数の数 fmt.Println(flag.NArg()) // フラグでないコマンドライン引数へのアクセス fmt.Println("args:", flag.Args()) for i := 0; i < flag.NArg(); i++ { fmt.Printf("引数%d: %s\n", i+1, flag.Arg(i)) } }
flagパッケージでは様々な型のオプションが用意されています。
bool型やUINT型といった指定方法も準備されているので、自前の作りこみが不要になります。
http://golang.jp/pkg/flagを参照して、利用していきます。