Subcommand CLI with the flag package
Go
package main
import (
"flag"
"fmt"
"os"
)
// run parses a global flag plus one subcommand, each with its own FlagSet.
func run(args []string) error {
global := flag.NewFlagSet("tool", flag.ContinueOnError)
verbose := global.Bool("v", false, "verbose output")
if err := global.Parse(args); err != nil {
return err
}
if global.NArg() < 1 {
return fmt.Errorf("usage: tool [-v] <add|list> [flags]")
}
switch command := global.Arg(0); command {
case "add":
add := flag.NewFlagSet("add", flag.ContinueOnError)
name := add.String("name", "", "item name")
if err := add.Parse(global.Args()[1:]); err != nil {
return err
}
fmt.Printf("added %q (verbose=%v)\n", *name, *verbose)
case "list":
fmt.Printf("alpha, beta (verbose=%v)\n", *verbose)
default:
return fmt.Errorf("unknown subcommand %q", command)
}
return nil
}
func main() {
if err := run(os.Args[1:]); err != nil {
fmt.Fprintln(os.Stderr, "error:", err)
os.Exit(1)
}
}