Определение независимых флагов в GoLang

Документация Go (http://golang.org/pkg/flag/) говорит:

Тип FlagSet позволяет определять независимые наборы флагов, например реализовать подкоманды в интерфейсе командной строки.

Мне нужна эта функциональность, но я не могу понять, как убедить флаг pkg сделать это. Когда я определяю два набора флагов, синтаксический анализ одного из них даст мне ошибки и предупреждения, если в командной строке есть флаги, предназначенные для второго. Пример:

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. Я хочу, чтобы эти флаги были разделены, потому что я хочу иметь -silent для -apply.

Что мне не хватает?

Ответы

Ответ 1

Вы должны сначала провести различие между подкомандами, а затем вызвать Parse справа 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)
    }
}

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