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

Share:
14,846

Related videos on Youtube

chowey
Author by

chowey

Updated on June 03, 2022

Comments

  • chowey
    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 OR cmd -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
      Not_a_Golfer about 10 years
      without 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
      Volker about 10 years
      Parsing 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.