首页 > 后端开发 > Golang > 如何在Go中为子命令正确定义和解析独立的FlagSet?

如何在Go中为子命令正确定义和解析独立的FlagSet?

Barbara Streisand
发布: 2024-12-11 04:43:08
原创
514 人浏览过

How to Properly Define and Parse Independent FlagSets in Go for Subcommands?

在 GoLang 中定义独立的 FlagSet

Go 文档指出 FlagSet 类型允许创建独立的标志集,这对于在命令中实现子命令非常有用 -线接口。然而,实现此功能可能具有挑战性。

定义两个 FlagSet 时,如果命令行包含用于第二个 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 -apply 或 cmd -reset 会生成各种警告。此行为是由于子命令之间缺乏区别造成的。为了有效地分离这些 FlagSet,需要首先区分子命令,然后解析正确的 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)
    }
}
登录后复制

此代码允许 -silent专门与 apply 子命令一起使用的标志,以及专门与 Reset 子命令一起使用的 -loud 标志。

以上是如何在Go中为子命令正确定义和解析独立的FlagSet?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板