GoLang 中的独立标志集
flag 包的 Go 文档声明它允许定义独立的标志集,适合用于在命令行界面中实现子命令。然而,问题是如何实现这一功能。
在定义了两个 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 对象,确保 -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) } }
采用这种方法,只会根据指定的子命令解析相关的 FlagSet,从而确保所需的行为。
以上是Go中如何实现子命令独立的标志集?的详细内容。更多信息请关注PHP中文网其他相关文章!