Command line 定义GoLang中的独立标志集

Command line 定义GoLang中的独立标志集,command-line,go,command-line-arguments,Command Line,Go,Command Line Arguments,Go文档()说: FlagSet类型允许定义独立的标志集,例如在命令行界面中实现子命令 我需要这个功能,但我不知道如何说服flag pkg去做。当我定义两个标志集时,如果命令行中有用于第二个标志集的标志,那么解析其中一个标志集将给我错误和警告。例如: f1 := flag.NewFlagSet("f1", flag.ContinueOnError) apply := f1.Bool("apply", false, "") silent := f1.Bool("silent", false, ""

Go文档()说:

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

我需要这个功能,但我不知道如何说服flag 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


我遗漏了什么?

您需要首先区分子命令,然后调用右侧的
FlagSet
调用
Parse

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

只需更改这些代码

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

但是警告就留在控制台上。如果你想删除它,请修改/usr/local/go/src/flag/flag.go并重新编译golang。。 或者复制一份flag包


  →_→ 怀疑的眼神~~

不必讨论这个具体问题——请允许我强烈推荐一个我正在使用的优秀的替代标志解析器(不是我的工作,我只是喜欢它)。解析一个
FlagSet
将使用所有选项,并且不会忽略某些选项,因此在解析一个FlagSet之前,您必须确定哪个选项适用。如果“reset”和“apply”是具有不同标志的子命令,则确定要运行和解析该标志集的子命令。你想做的事是做不到的。
f2.Parse(os.Args[1:])
fmt.Println(*reset)