pflag は Go の flag パッケージのドロップイン代替品で、POSIX/GNU スタイルの --flags を実装します。
pflag は、コマンドライン オプションの POSIX 推奨に対する GNU 拡張機能と互換性があります。より正確な説明については、以下の「コマンドライン フラグの構文」セクションを参照してください。
pflag は、Go 言語と同じ形式の BSD ライセンスの下で利用可能であり、LICENSE ファイルにあります。
pflag は、標準のgo get
コマンドを使用して利用できます。
以下を実行してインストールします。
go get github.com/spf13/pflag
以下を実行してテストを実行します。
go test github.com/spf13/pflag
pflag は、Go のネイティブ フラグ パッケージをドロップインで置き換えたものです。 pflag を「flag」という名前でインポートした場合、すべてのコードは変更なしで機能し続けるはずです。
import flag "github.com/spf13/pflag"
これには例外が 1 つあります。Flag 構造体を直接インスタンス化する場合は、設定する必要があるフィールド「Shorthand」がもう 1 つあります。ほとんどのコードはこの構造体を直接インスタンス化することはなく、代わりに String()、BoolVar()、Var() などの関数を使用するため、影響を受けません。
flag.String()、Bool()、Int() などを使用してフラグを定義します。
これは、ポインター ip に格納される、*int 型の整数フラグ -flagname を宣言します。
var ip * int = flag . Int ( "flagname" , 1234 , "help message for flagname" )
必要に応じて、Var() 関数を使用してフラグを変数にバインドできます。
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 )
FlagSet はあるものの、コード内のすべてのポインターを把握するのが難しい場合は、Flag に格納されている値を取得するヘルパー関数が利用できます。 int 型の「flagname」というフラグを持つ pflag.FlagSet がある場合は、GetInt() を使用して int 値を取得できます。ただし、「flagname」が存在し、int である必要があることに注意してください。 GetString("フラグ名") は失敗します。
i , err := flagset . GetInt ( "flagname" )
解析後、フラグの後の引数はスライス flag.Args() として、または個別に flag.Arg(i) として使用できます。引数には 0 から flag.NArg()-1 までのインデックスが付けられます。
pflag パッケージは、flag にはない、フラグを 1 文字で表す新しい関数も定義しています。これらは、フラグを定義する関数の名前に「P」を追加することで使用できます。
var ip = flag . IntP ( "flagname" , "f" , 1234 , "help message" )
var flagvar bool
func init () {
flag . BoolVarP ( & flagvar , "boolname" , "b" , true , "help message" )
}
flag . VarP ( & flagVal , "varname" , "v" , "help message" )
コマンドラインでは単一ダッシュを使用して短縮文字を使用できます。ブール短縮表現フラグは、他の短縮表現フラグと組み合わせることができます。
コマンドライン フラグのデフォルト セットは、トップレベル関数によって制御されます。 FlagSet タイプを使用すると、コマンド ライン インターフェイスでサブコマンドを実装するなど、独立したフラグのセットを定義できます。 FlagSet のメソッドは、コマンド ライン フラグ セットのトップレベル関数に似ています。
フラグを作成した後、指定されたフラグに pflag.NoOptDefVal を設定できます。これを行うと、フラグの意味がわずかに変わります。フラグに NoOptDefVal があり、そのフラグがオプションなしでコマンド ラインに設定された場合、フラグは NoOptDefVal に設定されます。たとえば次のようになります。
var ip = flag . IntP ( "flagname" , "f" , 1234 , "help message" )
flag . Lookup ( "flagname" ). NoOptDefVal = "4321"
次のような結果になります
解析された引数 | 結果の値 |
---|---|
--フラグ名=1357 | ip=1357 |
--フラグ名 | ip=4321 |
[何もない] | ip=1234 |
--flag // boolean flags, or flags with no option default values
--flag x // only on flags without a default value
--flag=x
flag パッケージとは異なり、オプションの前の 1 つのダッシュは 2 つのダッシュとは異なる意味を持ちます。単一のダッシュは、フラグの一連の短縮文字を表します。最後の短縮文字を除くすべては、ブール値フラグまたはデフォルト値を持つフラグである必要があります
// boolean or flags where the 'no option default value' is set
-f
-f=true
-abc
but
-b true is INVALID
// non-boolean and flags without a 'no option default value'
-n 1234
-n=1234
-n1234
// mixed
-abcs "hello"
-absd="hello"
-abcs1234
フラグの解析はターミネータ「--」の後で停止します。フラグ パッケージとは異なり、フラグはコマンド ラインのこのターミネータの前の任意の場所に引数を挿入できます。
整数フラグは 1234、0664、0x1234 を受け入れ、負の場合もあります。ブール フラグ (長い形式) は、1、0、t、f、true、false、TRUE、FALSE、True、False を受け入れます。期間フラグは、time.ParseDuration に対して有効な入力を受け入れます。
カスタムフラグ名「正規化機能」を設定することが可能です。これにより、コード内で作成された場合とコマンド ラインで使用された場合の両方で、フラグ名を「正規化された」形式に変更できます。 「正規化された」形式は比較に使用されます。カスタム正規化関数の使用例を 2 つ以下に示します。
例 #1 : -、_、および が必要です。フラグで同じものを比較します。別名 --my-flag == --my_flag == --my.flag
func wordSepNormalizeFunc ( f * pflag. FlagSet , name string ) pflag. NormalizedName {
from := [] string { "-" , "_" }
to := "."
for _ , sep := range from {
name = strings . Replace ( name , sep , to , - 1 )
}
return pflag . NormalizedName ( name )
}
myFlagSet . SetNormalizeFunc ( wordSepNormalizeFunc )
例 #2 : 2 つのフラグにエイリアスを付けたいとします。別名 --old-flag-name == --new-flag-name
func aliasNormalizeFunc ( f * pflag. FlagSet , name string ) pflag. NormalizedName {
switch name {
case "old-flag-name" :
name = "new-flag-name"
break
}
return pflag . NormalizedName ( name )
}
myFlagSet . SetNormalizeFunc ( aliasNormalizeFunc )
フラグまたはその省略表現を非推奨にすることは可能です。フラグ/短縮表記を非推奨にすると、そのフラグ/短縮表記がヘルプ テキストから非表示になり、非推奨のフラグ/短縮表記が使用されている場合に使用方法のメッセージが出力されます。
例 #1 : 「badflag」という名前のフラグを非推奨にし、代わりにどのフラグを使用する必要があるかをユーザーに通知したいとします。
// deprecate a flag by specifying its name and a usage message
flags . MarkDeprecated ( "badflag" , "please use --good-flag instead" )
これにより、ヘルプ テキストから「badflag」が非表示になり、 Flag --badflag has been deprecated, please use --good-flag instead
。
例 #2 : フラグ名「noshorthandflag」を保持し、その短縮名「n」を非推奨にしたいとします。
// deprecate a flag shorthand by specifying its flag name and a usage message
flags . MarkShorthandDeprecated ( "noshorthandflag" , "please use --noshorthandflag only" )
これにより、ヘルプ テキストから短縮名 "n" が非表示になり、 Flag shorthand -n has been deprecated, please use --noshorthandflag only
。
ここでは使用法メッセージが必須であり、空であってはいけないことに注意してください。
フラグを非表示としてマークすることができます。つまり、フラグは通常どおり機能しますが、使用方法やヘルプ テキストには表示されません。
例: 「secretFlag」という名前のフラグがありますが、これは内部使用のみに必要で、ヘルプ テキストに表示したり、その使用法テキストを表示したくないとします。
// hide a flag by specifying its name
flags . MarkHidden ( "secretFlag" )
pflag
使用すると、ヘルプと使用法メッセージのフラグの並べ替えを無効にすることができます。
例:
flags . BoolP ( "verbose" , "v" , false , "verbose output" )
flags . String ( "coolflag" , "yeaah" , "it's really cool flag" )
flags . Int ( "usefulflag" , 777 , "sometimes it's very useful" )
flags . SortFlags = false
flags . PrintDefaults ()
出力:
-v, --verbose verbose output
--coolflag string it's really cool flag (default "yeaah")
--usefulflag int sometimes it's very useful (default 777)
Go のflag
パッケージを使用して定義されたフラグをサポートするには、フラグをpflag
フラグセットに追加する必要があります。これは通常、サードパーティの依存関係 ( golang/glog
など) によって定義されたフラグをサポートするために必要です。
例: Go フラグをCommandLine
フラグセットに追加したい場合
import (
goflag "flag"
flag "github.com/spf13/pflag"
)
var ip * int = flag . Int ( "flagname" , 1234 , "help message for flagname" )
func main () {
flag . CommandLine . AddGoFlagSet ( goflag . CommandLine )
flag . Parse ()
}
pflag パッケージの完全なリファレンス ドキュメントは godoc.org で参照できます。また、 godoc -http=:6060
を実行して http://localhost:6060/pkg/github.com/spf13/pflag を参照すると、go の標準ドキュメント システムを通じて参照できます。取り付け後。