web-dev-qa-db-ja.com

GoLangでの独立したFlagSetの定義

Goのドキュメント( http://golang.org/pkg/flag/ )には次のように書かれています。

FlagSetタイプを使用すると、コマンドラインインターフェイスにサブコマンドを実装するなど、独立したフラグのセットを定義できます。

この機能が必要ですが、flagpkgにそれを実行するように説得する方法がわかりません。 2つのFlagSetを定義するときに、コマンドラインに2番​​目のフラグを対象としたフラグがある場合、そのうちの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_ OR _cmd -reset_を実行しようとすると、あらゆる種類の警告が表示されます。_-silent_のみが必要なため、これらのFlagSetを分離したい_-apply_のために働きます。

何が足りないのですか?

21
chowey

最初にサブコマンドを区別してから、右側のParseFlagSetを呼び出すことを目的としています。

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)
    }
}

http://play.golang.org/p/eaEEx_EReX

41
Daniel Darabos

これらのコードを変更するだけです

if err := f2.Parse(os.Args[1:]); err == nil {
    fmt.Println(*reset)
}

f2.Parse(os.Args[1:])
fmt.Println(*reset)

ただし、警告はコンソールに残されています。削除する場合は、/ usr/local/go/src/flag/flag.goを変更して、golangを再コンパイルするか、flagパッケージのコピーを実行してください。

→_→怀疑的眼神~~

0
anyanmw