命令行 – 在GoLang中定义独立的FlagSets

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来做到这一点.当我定义两个FlagSets时,解析其中的一个会给我错误和警告,如果命令行具有第二个标志.例:

f1 := flag.NewFlagSet("f1",flag.ContinueOnError)
apply := f1.Bool("apply",false,"")
silent := f1.Bool("silent","")
if err := f1.Parse(os.Args[1:]); err == nil {
    fmt.Println(*apply,*silent)
}
f2 := flag.NewFlagSet("f2",flag.ContinueOnError)
reset := f2.Bool("reset","")
if err := f2.Parse(os.Args[1:]); err == nil {
    fmt.Println(*reset)
}

如果我尝试执行cmd -opply OR cmd -reset,我会收到各种警告.我想保持这些FlagSets是分开的,因为我想只有-silent工作的应用程序.

我失踪了什么

您首先要区分子命令,然后在右侧的FlagSet上调用Parse.
f1 := flag.NewFlagSet("f1",flag.ContinueOnError)
silent := f1.Bool("silent","")
f2 := flag.NewFlagSet("f2",flag.ContinueOnError)
loud := f2.Bool("loud","")

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

相关文章

程序目录结构 简单实现,用户登录后返回一个jwt的token,下次请求带上token请求用户信息接口并返回信息...
本篇博客的主要内容是用go写一个简单的Proof-of-Work共识机制,不涉及到网络通信环节,只是一个本地的简...
简介 默克尔树(MerkleTree)是一种典型的二叉树结构,其主要特点为: 最下面的叶节点包含存储数据或其...
接下来学习并发编程, 并发编程是go语言最有特色的地方, go对并发编程是原生支持. goroutine是go中最近本...
先普及一下, 什么是广度优先搜索 广度优先搜索类似于树的层次遍历。从图中的某一顶点出发,遍历每一个顶...
第一天: 接口的定义和实现 第二天: 一. go语言是面向接口编程. 在学习继承的时候说过, go语言只有封装,...