Go by Example: Command-Line Flags

コマンドラインフラグ は、コマンドラインプログラムに対してオプションを指定する 一般的な方法です。例えば、wc -l での -l がコマンドラインフラグになります。

package main

Go は、基本的なコマンドラインフラグのパースをサポートする flag パッケージを提供しています。 サンプルのコマンドラインプログラムを実装するために、 このパッケージを使いましょう。

import (
    "flag"
    "fmt"
)
func main() {

基本的なフラグ宣言は、文字列、整数、真偽値に対して 利用できます。ここでは、文字列フラグ word をデフォルト値 "foo" と簡単な説明とともに宣言します。 この flag.String 関数は、(文字列値ではなく) 文字列ポインタを返します。 このポインタの使い方は後ほど確認します。

    wordPtr := flag.String("word", "foo", "a string")

次の例は、word フラグと同じ方法を使って、 numb フラグと fork フラグを宣言しています。

    numbPtr := flag.Int("numb", 42, "an int")
    forkPtr := flag.Bool("fork", false, "a bool")

プログラムの別の場所で宣言された変数を使うような オプションを宣言することも可能です。 フラグを宣言する関数にポインタの形で渡す必要がある点に 注意してください。

    var svar string
    flag.StringVar(&svar, "svar", "bar", "a string var")

すべてのフラグを宣言したら、コマンドラインをパースするために flag.Parse() を呼び出します。

    flag.Parse()

ここでは、パースしたオプションと残りの任意の引数を 単に出力します。実際のオプション値を取得するために、 *wordPtr のようにポインタをデリファレンスする 必要がある点に気をつけてください。

    fmt.Println("word:", *wordPtr)
    fmt.Println("numb:", *numbPtr)
    fmt.Println("fork:", *forkPtr)
    fmt.Println("svar:", svar)
    fmt.Println("tail:", flag.Args())
}

コマンドラインフラグをもつプログラムを試すためには、 先にコンパイルして、出力されたバイナリを直接実行するのがよいです。

$ go build command-line-flags.go

まずはビルドされたプログラムにすべてのフラグの値を指定して みましょう。

$ ./command-line-flags -word=opt -numb=7 -fork -svar=flag
word: opt
numb: 7
fork: true
svar: flag
tail: []

フラグを省略すると、 自動的にフラグごとのデフォルト値となる点に注意してください。

$ ./command-line-flags -word=opt
word: opt
numb: 42
fork: false
svar: bar
tail: []

位置引数は、任意のフラグの後に続けて指定できます。

$ ./command-line-flags -word=opt a1 a2 a3
word: opt
...
tail: [a1 a2 a3]

flag パッケージは、すべてのフラグが位置引数の前に 出現することを要求する点に注意してください。 (さもないと、フラグも位置引数として解釈されてしまいます)

$ ./command-line-flags -word=opt a1 a2 a3 -numb=7
word: opt
numb: 42
fork: false
svar: bar
tail: [a1 a2 a3 -numb=7]

コマンドラインプログラムに対して自動生成された ヘルプテキストを取得するには、-h または --help フラグを使います。

$ ./command-line-flags -h
Usage of ./command-line-flags:
  -fork=false: a bool
  -numb=42: an int
  -svar="bar": a string var
  -word="foo": a string

flag パッケージに指定されていないフラグを与えた場合は、 プログラムはエラーメッセージを表示して、ヘルプテキストを 再度表示します。

$ ./command-line-flags -wat
flag provided but not defined: -wat
Usage of ./command-line-flags:
...

Next example: Command-Line Subcommands.