在GoLang中定义独立的FlagSet

时间:2014-07-01 06:49:58

标签: command-line go command-line-arguments

Go文档(http://golang.org/pkg/flag/)说:

  

FlagSet类型允许定义独立的标志集,例如在命令行界面中实现子命令。

我需要这个功能,但我无法弄清楚如何说服标志pkg这样做。当我定义两个FlagSet时,如果命令行具有针对第二个标记的标记,则解析其中一个将给出错误和警告。例如:

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 -applycmd -reset,我会收到各种警告。我希望将这些FlagSet分开,因为我希望-silent只能使用-apply

我错过了什么?

2 个答案:

答案 0 :(得分:38)

您首先要区分子命令,然后在右侧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

答案 1 :(得分:0)

只需更改这些代码

即可
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 .. 或者做一下旗帜包裹。

→_→怀疑的眼神~~