Goでのコマンドラインフラグの使用

Goを使用してCLIフラグを処理する方法はたくさんあります。最初のオプションは、ライブラリをまったく使用せず、検査することです。os.Args。 2番目のオプションは、標準ライブラリを使用することですflagパッケージ。 3番目のオプションは、次のような多くのサードパーティCLIライブラリの1つを使用することです。コブラ

2番目のオプションについて話しましょう:標準ライブラリを使用するflag、の生の解析よりも多くの利点を提供するためos.Argsそしてそれは内蔵されています。

追加import "flag"パッケージのインポートセクションに移動すると、すぐに使用できます。

受け入れるにはintパラメータタイプ:

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

var count = flag.Int(“count”, 5, “the count of items”) fmt.Println("count value ", *count)

最初のパラメーターはCLIコマンドで使用されるフラグ名、2番目のパラメーターはデフォルト値、3番目は説明です。

代替構文はによって提供されますflag.IntVar()

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

var count int flag.IntVar(&count, “count”, 5, “the count of items”) fmt.Println("count value ", count)

ここでパラメーターはシフトされ、最初のパラメーターは変数参照です。

主な違いは、最初のケースでは、ポインターを取得することです。 2番目のケースでは、値を取得します。

flagさまざまなフラグタイプを解析するための多くの関数を提供します。受け入れるタイプごとに異なる関数を使用する必要があります。

func Bool(name string, value bool, usage string) *bool
func BoolVar(p *bool, name string, value bool, usage string)
func Duration(name string, value time.Duration, usage string) *time.Duration
func DurationVar(p *time.Duration, name string, value time.Duration, usage string)
func Float64(name string, value float64, usage string) *float64
func Float64Var(p *float64, name string, value float64, usage string)
func Int(name string, value int, usage string) *int
func Int64(name string, value int64, usage string) *int64
func Int64Var(p *int64, name string, value int64, usage string)
func IntVar(p *int, name string, value int, usage string)
func String(name string, value string, usage string) *string
func StringVar(p *string, name string, value string, usage string)
func Uint(name string, value uint, usage string) *uint
func Uint64(name string, value uint64, usage string) *uint64
func Uint64Var(p *uint64, name string, value uint64, usage string)
func UintVar(p *uint, name string, value uint, usage string)

フラグに間違ったタイプを渡すと、エラーが発生し、プログラムが停止し、必要な使用法がユーザーに出力されます。

例として、文字列を解析する方法は次のとおりです。

var description = flag.String("description", "default value", "the description of the flag")

フラグ構文

どのようにフラグを設定しますか?シンプル:アタッチ-flagnameCLIコマンドに、4つの代替の同等の構文を使用します。

-count=x
-count x
--count=x
--count x

コマンドに必要な数のフラグを渡すことができますが、初めてですflagフラグを認識しない場合、追加のフラグの解析を停止します。これは、フラグ以外のパラメータもある場合、フラグはすべて最初に配置する必要があることを意味します。

フラグを解析します

すべてのフラグを定義した後、呼び出す必要があります

flag.Parse()

実際にそれらを解析します。

ブールフラグ

ブールフラグは、追加するだけで設定できます-count、ブールフラグにtrue値。を設定するにはfalse値、使用-count=false。これらの値はいずれもブールフラグに有効です。1, 0, t, f, T, F, true, false, TRUE, FALSE, True, False

短い代替案

現実の世界では、CLIアプリがわかりやすい名前のフラグと、文字の省略形の同じフラグを受け入れることがよくあります。 2つのフラグハンドラーを提供することでそれを行うことができます。

var gopherType string

func init() { const ( defaultGopher = “pocket” usage = “the variety of gopher” ) flag.StringVar(&gopherType, “gopher_type”, defaultGopher, usage) flag.StringVar(&gopherType, “g”, defaultGopher, usage+" (shorthand)") }

非フラグパラメータの解析

ザ・flagパッケージは、フラグ以外のパラメーターも解析するメソッドを提供します。

flag.Args()

フラグとして解析されていないパラメータを持つ文字列のスライスを返します。

必要に応じてフラグを強制する

ザ・flagパッケージは、この問題の組み込みソリューションを提供していません。このケースは自分で管理する必要があります。

// [...]
flag.Parse()

if *count == “” { flag.PrintDefaults() os.Exit(1) }

より高度なトピック

これは紹介記事です。ここから、サブコマンドの実装や独自のフラグタイプの定義など、より詳細なトピックに進むことができます。見るhttps://blog.komand.com/build-a-simple-cli-tool-with-golangCLIのより高度な使用法について。

参照


その他のチュートリアル: