Go语言:命令行参数解析模块docopt-go的使用方法

docopt-godocopt标准(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

猜你喜欢

转载自blog.csdn.net/pengpengzhou/article/details/109237900
今日推荐