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中文网其他相关文章!