58 lines
1.5 KiB
Go
58 lines
1.5 KiB
Go
// 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)
|
|
}
|
|
}
|