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)
	}
}