コマンドライン引数に使える標準ライブラリの flag をちょいと試してみた。
前に使った viperよりシンプルっぽい。
例によって、今日も自分のためのブログであり、ヤクの毛狩りの途中なのです。
flag の使い方
Go はコマンドラインツールを書くには最高の言語ですが、実行時のパラメータ引数をよしなに行ってくれるライブラリが flag
です。
package main
import (
"flag"
"fmt"
)
func main() {
var name = flag.String("name", "Ushio", "please specify -name flag")
flag.Parse()
fmt.Println("The name flag is ", *name)
}
ポイントはものすごく簡単で、flag.String
とか、flag.Int
などのメソッドで、パースしたいパラメーターを指定して、Parse
を実行したらパースして、変数に入れてくれると言う具合です。デフォルト値や、マニュアルにも対応しています。
$ go run spike.go -name Yamada
The name flag is Yamada
$ go run spike.go -name=Yamada
The name flag is Yamada
$ go run spike.go
The name flag is Ushio
ちなみに、簡易的なマニュアルにもなっています。コンパイルしていないので、表示があれですが。結構これだけで感じのいいことができそう。
$ go run spike.go --help
Usage of /var/folders/mj/yr9zy_sd503_g3f_mwfwr98h0000gn/T/go-build817669832/command-line-arguments/_obj/exe/spike:
-name string
please specify -name flag (default "Ushio")
exit status 2
ちなみに、ちょっとした違う書き方としてこんな書き方もできます。
var num int
flag.IntVar(&num, "num", 100, "Please specify -num flag")
flag.Parse()
fmt.Println("The num is ", num)
サブコマンド
Go を使ったコマンドラインプログラムでは、よくサブコマンドが出てきますが、これも簡単にかけます。
flags := flag.NewFlagSet("sub", flag.ContinueOnError)
file := flags.String("f", "", "path to file")
flags.Parse(os.Args[2:])
fmt.Println("file ", *file)
こちらを実行するとこんな感じ。os.Args[2:]
でスライスの指定をしているので、第二引数以降しか、フラグはパースしていません。サブコマンドがある上での、パラメータになっています。
$ go run spike.go -f filename
file
$ go run spike.go sub -f filename
file filename
いい感じですね。ちなみに、私の書いたコードでこれがよくててきたのは、Cloud Foundry のプラグインを書いたコードでした。
まだまだ先は長いので、次いきます。