go - 在 GoLang 中定义独立的标志集

标签 go command-line command-line-arguments go-flag flag-go

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

The FlagSet type allows one to define independent sets of flags, such as to implement subcommands in a command-line interface.

我需要这个功能,但我不知道如何说服标志 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,我会收到各种警告。我想将这些标志集分开,因为我只想让 -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)
    }
}

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

关于go - 在 GoLang 中定义独立的标志集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24504024/

相关文章:

c++ - QCommandLineParser 向参数添加功能

go - 如何在 Go 中的 fmt.Scanf() 之后刷新标准输入?

go - 如何在 Go 中中止 net.Dial 调用?

go - 为什么我的 golang 模板没有选择外部 javascript 文件?

windows - 如何使用Windows命令行查找文件中字符串的出现次数?

windows - 批处理脚本 : issue with colored echo when chaining commands

go - 用于 Go 的 JMX[lang]

command-line - 如何使用命令行在 WebStorm 中打开项目 (Windows 10)

c - 来自命令行参数的段错误(核心转储)

java - 如何将枚举与命令行参数一起使用?