Определение независимых флагов в 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