github.com/jessevdk/go-flags is the go-to tool for argument processing. It supports subcommands but understanding how to do it is a feat of reverse-engineering. So, here is an example.
Code:
package main import ( "os" "github.com/jessevdk/go-flags" ) type readParameters struct { } type writeParameters struct { } type parameters struct { Verbose bool `short:"v" long:"verbose" description:"Display logging"` Read readParameters `command:"read" alias:"r" description:"Read functions"` Write readParameters `command:"write" alias:"w" description:"Write functions"` } var ( arguments = new(parameters) ) func main() { p := flags.NewParser(arguments, flags.Default) _, err := p.Parse() if err != nil { os.Exit(-1) } switch p.Active.Name { case "read": //... case "write": //... } }
If you were to save it as "args.go", this is what the help and the usage would look like:
$ go run args.go -h Usage: args [OPTIONS] Application Options: -v, --verbose Display logging Help Options: -h, --help Show this help message Available commands: read Read functions (aliases: r) write Write functions (aliases: w) exit status 255 $ go run args.go read