ホームページ >バックエンド開発 >Golang >Go でサブコマンド用に独立した FlagSet を適切に定義して解析するにはどうすればよいですか?

Go でサブコマンド用に独立した FlagSet を適切に定義して解析するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-11 04:43:08488ブラウズ

How to Properly Define and Parse Independent FlagSets in Go for Subcommands?

GoLang での独立した FlagSet の定義

Go のドキュメントには、FlagSet 型を使用すると独立したフラグのセットを作成できると記載されており、これはコマンドでサブコマンドを実装するのに役立ちます。ラインインターフェース。ただし、この機能の実装は困難な場合があります。

2 つの FlagSet を定義する場合、コマンド ラインに 2 番目の FlagSet を対象としたフラグが含まれていると、そのうちの 1 つを解析するとエラーまたは警告が発生する可能性があります。たとえば、次のコードについて考えてみましょう。

f1 := flag.NewFlagSet("f1", flag.ContinueOnError)
apply := f1.Bool("apply", false, "")
silent := f1.Bool("silent", false, "")
if err := f1.Parse(os.Args[1:]); err == nil {
    fmt.Println(*apply, *silent)
}
f2 := flag.NewFlagSet("f2", flag.ContinueOnError)
reset := f2.Bool("reset", false, "")
if err := f2.Parse(os.Args[1:]); err == nil {
    fmt.Println(*reset)
}

cmd -apply または cmd -reset を実行すると、さまざまな警告が生成されます。この動作は、サブコマンド間の区別がないことが原因です。これらの FlagSet を効果的に分離するには、最初にサブコマンドを区別してから、正しい FlagSet を解析する必要があります。

これを実現する方法の例:

f1 := flag.NewFlagSet("f1", flag.ContinueOnError)
silent := f1.Bool("silent", false, "")
f2 := flag.NewFlagSet("f2", flag.ContinueOnError)
loud := f2.Bool("loud", false, "")

switch os.Args[1] {
  case "apply":
    if err := f1.Parse(os.Args[2:]); err == nil {
      fmt.Println("apply", *silent)
    }
  case "reset":
    if err := f2.Parse(os.Args[2:]); err == nil {
      fmt.Println("reset", *loud)
    }
}

このコードでは、-silent を使用できます。フラグは apply サブコマンドでのみ使用され、-loud フラグはリセット サブコマンドでのみ使用されます。

以上がGo でサブコマンド用に独立した FlagSet を適切に定義して解析するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。