Defining Independent FlagSets in GoLang
14,846
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
Related videos on Youtube
Author by
chowey
Updated on June 03, 2022Comments
-
chowey about 2 years
The Go documentation (http://golang.org/pkg/flag/) says:
The FlagSet type allows one to define independent sets of flags, such as to implement subcommands in a command-line interface.
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) }
I get all sorts of warnings if I try to do
cmd -apply
ORcmd -reset
. I want to keep these FlagSets separate because I want to only have-silent
work for-apply
.What am I missing?
-
Not_a_Golfer about 10 yearswithout getting into this specific problem - allow me to highly recommend an excellent alternative flags parser that I am using (not my work, I just like it). github.com/jessevdk/go-flags
-
Volker about 10 yearsParsing a
FlagSet
will consume all options and won't ignore some, so you'll have to determine before parsing a FlagSet which one applies. If "reset" and "apply" are subcommand with different flags determine which subcommand to run and parse that FlagSet. What you are trying to do cannot be done.
-