// Some command-line tools, like the `go` tool or `git` // have many *subcommands*, each with its own set of // flags. For example, `go build` and `go get` are two // different subcommands of the `go` tool. // The `flag` package lets us easily define simple // subcommands that have their own flags. package main import ( "flag" "fmt" "os" ) func main() { // We declare a subcommand using the `NewFlagSet` // function, and proceed to define new flags specific // for this subcommand. fooCmd := flag.NewFlagSet("foo", flag.ExitOnError) fooEnable := fooCmd.Bool("enable", false, "enable") fooName := fooCmd.String("name", "", "name") // For a different subcommand we can define different // supported flags. barCmd := flag.NewFlagSet("bar", flag.ExitOnError) barLevel := barCmd.Int("level", 0, "level") // The subcommand is expected as the first argument // to the program. if len(os.Args) < 2 { fmt.Println("expected 'foo' or 'bar' subcommands") os.Exit(1) } // Check which subcommand is invoked. switch os.Args[1] { // For every subcommand, we parse its own flags and // have access to trailing positional arguments. case "foo": fooCmd.Parse(os.Args[2:]) fmt.Println("subcommand 'foo'") fmt.Println(" enable:", *fooEnable) fmt.Println(" name:", *fooName) fmt.Println(" tail:", fooCmd.Args()) case "bar": barCmd.Parse(os.Args[2:]) fmt.Println("subcommand 'bar'") fmt.Println(" level:", *barLevel) fmt.Println(" tail:", barCmd.Args()) default: fmt.Println("expected 'foo' or 'bar' subcommands") os.Exit(1) } }