在GoLang中定义独立标志集 [英] Defining Independent FlagSets in GoLang

查看:263
本文介绍了在GoLang中定义独立标志集的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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


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

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

我需要这个功能,但我不知道如何说服pkg的标志。当我定义两个FlagSet,解析其中一个将给我错误和警告,如果命令行有第二个标志。示例:

I need this functionality but I can't figure out how to persuade the flag pkg to do it. When I define two FlagSets, parsing one of them will give me errors and warnings if the commandline has flags that are meant for the second one. Example:

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 ,我会收到各种警告。我想把这些FlagSets分开,因为我只想让 -silent -apply 工作。

I get all sorts of warnings if I try to do cmd -apply OR cmd -reset. I want to keep these FlagSets separate because I want to only have -silent work for -apply.

我缺少什么?

推荐答案

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

You are meant to distinguish between subcommands first, and then call Parse on the right 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

这篇关于在GoLang中定义独立标志集的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆