docopt-go是docopt标准(Command-line interface description language)的Go语言实现。可打印帮助,版本以及获取各种类型的可选参数。基本用法如下:
cmdtool.go
package main
import (
"errors"
"fmt"
"github.com/docopt/docopt-go"
"strconv"
)
func ArgvString(argvMap map[string]interface{}, name string) (string, error) {
if argvMap[name] == nil {
return "", nil
}
if strval, ok := argvMap[name].(string); ok {
return strval, nil
} else {
return "", errors.New(name + " is not valid string!")
}
}
func ArgvInt(argvMap map[string]interface{}, name string) (int, error) {
if argvMap[name] == nil {
return 0, nil
}
if strval, ok := argvMap[name].(string); ok {
n, err := strconv.Atoi(strval)
if err != nil {
return -1, errors.New(name + " is not an integer!")
}
return n, nil
} else {
return -1, errors.New(name + " is not an integer!")
}
}
func main() {
usage := `cmdtool.
Usage:
cmdtool -h | --help
cmdtool --version
cmdtool [--cpu=<n>] [--log=FILE] [--auth]
Options:
-h --help show help.
-v --version show version.
--cpu=<n> number of cpu for goroutine [default: 10].
-l FILE, --log=FILE filename of log file.
--auth authentication required.
`
argvMap, err := docopt.ParseDoc(usage)
if err != nil {
fmt.Println("parse arguments failed!")
return
}
if argvMap["--version"] == true {
fmt.Printf("version=0.0.1\n")
return
}
//integer
ncpu, err_cpu := ArgvInt(argvMap, "--cpu")
if err_cpu != nil {
fmt.Printf("%s\n", err_cpu.Error())
} else {
fmt.Printf("cpu=%d\n", ncpu)
}
//string
logfile, err_log := ArgvString(argvMap, "--log")
if err_log != nil {
fmt.Printf("%s\n", err_log.Error())
} else {
fmt.Printf("filename=%s\n", logfile)
}
//boolean
fmt.Printf("auth=%t\n", argvMap["--auth"])
}
查看帮助:
[root@dev example]# ./cmdtool -h
cmdtool.
Usage:
cmdtool -h | --help
cmdtool --version
cmdtool [--cpu=<n>] [--log=FILE] [--auth]
Options:
-h --help show help.
-v --version show version.
--cpu=<n> number of cpu for goroutine [default: 10].
-l FILE, --log=FILE filename of log file.
--auth authentication required.
查看版本:
[root@dev example]# ./cmdtool -v
version=0.0.1
[root@dev example]# ./cmdtool --version
version=0.0.1
查看可选参数:
[root@dev example]# ./cmdtool --auth --log=/data/log/server.log --cpu=4
cpu=4
filename=/data/log/server.log
auth=true