import "flag"

コマンドラインのフラグ解析を実装しています。

使用方法:

flag.String()、Bool()、Int()などを使用してフラグを定義します。下はサンプルです。

import "flag"
var ip *int = flag.Int("flagname", 1234, "help message for flagname")

必要であれば、フラグをxxxVar()関数を使って変数にバインドできます。

var flagvar int
func init() {
	flag.IntVar(&flagvar, "flagname", 1234, "help message for flagname")
}

もしくは、Valueインタフェース(ポインタのレシーバを伴なう)を実装するカスタムフラグを作成し、次のようにしてフラグを解析させます。

flag.Var(&flagVal, "name", "help message for flagname")

このようなフラグは、変数の初期値がデフォルト値になります。

すべてのフラグの定義が完了したら、次の関数を呼び出します。

flag.Parse()

コマンドラインが解析されて、定義されたフラグにセットされます。

その後は、定義したフラグを直接使用します。変数にバインドしていないフラグはすべてポインタで、変数にバインドしているときは値です。

fmt.Println("ip has value ", *ip);
fmt.Println("flagvar has value ", flagvar);

解析のあと、フラグの以降の引数は、flag.Args()として、また個々の引数はflag.Arg(i)として得られます。この引数は0からflag.NArg()までインデックス付けられています。

コマンドラインでのフラグの指定方法:

-flag
-flag=x
-flag x  // 非論理値型フラグのみ

フラグの指定には、マイナス記号(1つ、もしくは2つ。どちらも同じ)が使われます。上の3番目の形式は論理値型のフラグには使えません。理由は下のコマンドを見ていただいたあとに説明します。

cmd -x *

この*記号はファイル名に展開されるので、0やfalseといった名前のファイルが存在すると正しく機能しないためです。論理値型のフラグをoffにするには-flag=falseと指定する必要があります。

フラグの解析は、-flag形式でない引数の直前、またはターミネータの”–”(マイナス記号2つだけ)で中止します。”-”(マイナス記号一つだけ)はフラグとはみなされません。

整数型のフラグは1234、0664、0×1234、マイナス値のいずれでも受け付けます。論理値型のフラグは1、0、t、f,true、false、TRUE、FALSE、True、Falseを受け付けます。

flag.Parseは、os.Argsを変更したあとであっても、何回でも安全に呼び出せます。これにより、次のように後からフラグを追加するサブコマンドを伴ったコマンドラインの実行が可能になります。

flag.Bool(...)  // グローバルオプション
flag.Parse()  // 主要なコマンドの解析
subcmd := flag.Args(0)
switch subcmd {
	// サブコマンドごとにオプションを追加
}
os.Args = flag.Args()
flag.Parse()

パッケージファイル

flag.go

変数

Usageは、定義されている全フラグの使用方法(usage)を標準エラーに出力します。この変数は関数であり、独自の関数のポインタに入れ替えができます。

var Usage = func() {
    fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0])
    PrintDefaults()
}

Arg関数

func Arg(i int) string

Argは、i番目のコマンドライン引数を返します。Arg(0)はフラグ処理後に残された先頭の引数です。

Args関数

func Args() []string

Argsは、フラグでないコマンドライン引数を返します。

Bool関数

func Bool(name string, value bool, usage string) *bool

Boolは、名前、デフォルト値、使用方法を指定してboolフラグを定義します。戻り値はフラグの値が格納されるbool型変数のアドレスです。

BoolVar関数

func BoolVar(p *bool, name string, value bool, usage string)

BoolVarは、名前、デフォルト値、使用方法を指定してboolフラグを定義します。引数pはフラグの値が格納されるbool型変数のポインタです。

Float関数

func Float(name string, value float, usage string) *float

Floatは、名前、デフォルト値、使用方法を指定してfloatフラグを定義します。戻り値はフラグの値が格納されるfloat型変数のアドレスです。

Float64関数

func Float64(name string, value float64, usage string) *float64

Float64は、名前、デフォルト値、使用方法を指定してfloat64フラグを定義します。戻り値はフラグの値が格納されるfloat64型変数のアドレスです。

Float64Var関数

func Float64Var(p *float64, name string, value float64, usage string)

Float64Varは、名前、デフォルト値、使用方法を指定してfloat64フラグを定義します。引数pはフラグの値が格納されるfloat64型変数のポインタです。

FloatVar関数

func FloatVar(p *float, name string, value float, usage string)

FloatVarは、名前、デフォルト値、使用方法を指定してfloatフラグを定義します。引数pはフラグの値が格納されるfloat型変数のポインタです。

Int関数

func Int(name string, value int, usage string) *int

Intは、名前、デフォルト値、使用方法を指定してintフラグを定義します。戻り値はフラグの値が格納されるint型変数のアドレスです。

Int64関数

func Int64(name string, value int64, usage string) *int64

Int64は、名前、デフォルト値、使用方法を指定してint64フラグを定義します。戻り値はフラグの値が格納されるint64型変数のアドレスです。

Int64Var関数

func Int64Var(p *int64, name string, value int64, usage string)

Int64Varは、名前、デフォルト値、使用方法を指定してint64フラグを定義します。引数pはフラグの値が格納されるint64型変数のポインタです。

IntVar関数

func IntVar(p *int, name string, value int, usage string)

IntVarは、名前、デフォルト値、使用方法を指定してintフラグを定義します。引数pはフラグの値が格納されるint型変数のポインタです。

NArg関数

func NArg() int

NArgは、フラグが処理された後に残った引数の数です。

NFlag関数

func NFlag() int

Parse関数

func Parse()

Parseは、コマンドラインフラグを解析します。全てのフラグが定義されたあと、フラグを使用する前に呼び出さなくてはなりません。

PrintDefaults関数

func PrintDefaults()

PrintDefaultsは、定義された全てのフラグのデフォルト値を標準エラーに出力します。

Set関数

func Set(name, value string) bool

Setは、指定した名前のフラグに値をセットします。成功したときはtrueが返り、フラグが定義されていないとfalseが返されます。

String関数

func String(name, value string, usage string) *string

Stringは、名前、デフォルト値、使用方法を指定してstringフラグを定義します。戻り値はフラグの値が格納されるstring型変数のアドレスです。

StringVar関数

func StringVar(p *string, name, value string, usage string)

StringVarは、名前、デフォルト値、使用方法を指定してstringフラグを定義します。引数pはフラグの値が格納されるstring型変数のポインタです。

Uint関数

func Uint(name string, value uint, usage string) *uint

Uintは、名前、デフォルト値、使用方法を指定してuintフラグを定義します。戻り値はフラグの値が格納されるuint型変数のアドレスです。

Uint64関数

func Uint64(name string, value uint64, usage string) *uint64

Uint64は、名前、デフォルト値、使用方法を指定してuint64フラグを定義します。戻り値はフラグの値が格納されるuint64型変数のアドレスです。

Uint64Var関数

func Uint64Var(p *uint64, name string, value uint64, usage string)

Uint64Varは、名前、デフォルト値、使用方法を指定してuint64フラグを定義します。引数pはフラグの値が格納されるuint64型変数のポインタです。

UintVar関数

func UintVar(p *uint, name string, value uint, usage string)

UintVarは、名前、デフォルト値、使用方法を指定してstringフラグを定義します。引数pはフラグの値が格納されるstring型変数のポインタです。

Var関数

func Var(value Value, name string, usage string)

Varは、名前、デフォルト値、使用方法を指定してユーザ型のフラグを定義します。引数pはフラグの値が格納されるValue型変数のポインタです。

Visit関数

func Visit(fn func(*Flag))

Visitは、フラグをパラメータにfnを繰り返し呼び出します。実際にセットされたフラグだけが処理されます。

VisitAll関数

func VisitAll(fn func(*Flag))

VisitAllは、フラグをパラメータにfnを繰り返し呼び出します。セットされたかに関わらず全てのフラグが処理されます。

Flag型

Flagは、フラグの状態を表します。

type Flag struct {
    Name     string // コマンドラインで使われる名前
    Usage    string // ヘルプメッセージ
    Value    Value  // セットされた値
    DefValue string // デフォルト値(文字列で)。これはヘルプメッセージで使用される
}

Lookup関数

func Lookup(name string) *Flag

Lookupは、名前に該当するFlag構造体を返します。フラグが存在しないときはnilが返ります。

Value型

Valueは、動的な値をフラグに格納するためのインタフェースです。(デフォルト値は文字列で表されます)

type Value interface {
    String() string
    Set(string) bool
}