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