flagパッケージはコマンドラインのフラグを解析するのに便利なパッケージです。
flagパッケージをインポートする
import "flag"
フラグの値を格納する変数を定義する
関数外で定義する場合の書き方
後述するinit()のXxxVar()で変数にバインドする場合はフラグを格納するための変数を用意する。
var boolFlag bool
var intFlag int
var strFlag string
関数内で定義する書き方
後述するinit()のXxxVar()で変数にバインドしなかった場合はポインタとなる。
boolPtr := flag.Bool("b", false, "真偽値の値の例")
intPtr := flag.Int("i", 0, "数値の場合の例")
strPtr := flag.String("s", "", "文字列の場合の例")
フラグの初期化
init() はmain()が呼ばれる前に実行される。
main内に記述したflag.Parse()によって変数に指定されたフラグの値が入るが、initの時点ではまだ変数には値が入っていない状態。
そのためここではフラグの値を格納するためのポインタを予約するだけの挙動となる。
XxxVar()で変数にバインドする。引数には変数のポインタ、フラグの名前、デフォルト値、使い方の説明を記述する。
func init() {
flag.BoolVar(&boolFlag, "b", false, "真偽値の値を指定")
flag.IntVar(&intFlag, "i", 0, "数値の値を指定")
flag.StringVar(&strFlag, "s", "", "文字列の値を指定")
}
フラグの解析と取得
flag.Parse()を呼ぶことでコマンドラインの引数のフラグが解析され、フラグが変数にバインドされる。
flag.Parse()
これ以降、変数からフラグの値を取得できるようになる。
コマンドラインでの実行例
ソースファイルから実行する場合
# フラグの指定なし
go run flagsample.go
# フラグの指定あり
go run flagsample.go -b
go run flagsample.go -b -i=1 -s=a
バイナリファイルから実行する場合
# プログラムをコンパイルし、
go build flagsample.go
# その後バイナリを実行する。
./flagsample -b -i=1 -s=a
ソースの全体像
関数外で定義する場合の書き方
package main
import (
"flag"
"fmt"
)
var boolFlag bool
var intFlag int
var strFlag string
func init() {
flag.BoolVar(&boolFlag, "b", false, "真偽値の値の例")
flag.IntVar(&intFlag, "i", 0, "数値の場合の例")
flag.StringVar(&strFlag, "s", "", "文字列の場合の例")
}
func main() {
flag.Parse()
fmt.Println(boolFlag)
fmt.Println(intFlag)
fmt.Println(strFlag)
}
関数内で定義する書き方
package main
import (
"flag"
"fmt"
)
func main() {
boolPtr := flag.Bool("b", false, "真偽値の値の例")
intPtr := flag.Int("i", 0, "数値の場合の例")
strPtr := flag.String("s", "", "文字列の場合の例")
flag.Parse()
fmt.Println(*boolPtr)
fmt.Println(*intPtr)
fmt.Println(*strPtr)
}