pflag

第三方的命令行参数解析包 pflag 比 flag 包使用的更为广泛。pflag 包的设计目的就是替代标准库中的 flag 包,因此它具有更强大的功能并且与标准的兼容性更好

安装pflag包
$ go get github.com/spf13/pflag

package main

import flag "github.com/spf13/pflag"
import (
    "fmt"
    "strings"
)

// 定义命令行参数对应的变量
var cliName = flag.StringP("name", "n", "nick", "Input Your Name")
var cliAge = flag.IntP("age", "a",22, "Input Your Age")
var cliGender = flag.StringP("gender", "g","male", "Input Your Gender")
var cliOK = flag.BoolP("ok", "o", false, "Input Are You OK")
var cliDes = flag.StringP("des-detail", "d", "", "Input Description")
var cliOldFlag = flag.StringP("badflag", "b", "just for test", "Input badflag")

func wordSepNormalizeFunc(f *flag.FlagSet, name string) flag.NormalizedName {
    from := []string{"-", "_"}
    to := "."
    for _, sep := range from {
        name = strings.Replace(name, sep, to, -1)
    }
    return flag.NormalizedName(name)
}

func main() {
    // 设置标准化参数名称的函数
    flag.CommandLine.SetNormalizeFunc(wordSepNormalizeFunc)
    
    //pflag 包支持通过简便的方式为参数设置默认值之外的值,实现方式为设置参数的 NoOptDefVal 属性
    // 为 age 参数设置 NoOptDefVal
    // 比如-a不带参数则为25
    flag.Lookup("age").NoOptDefVal = "25"

    // 把 badflag 参数标记为即将废弃的,请用户使用 des-detail 参数
    flag.CommandLine.MarkDeprecated("badflag", "please use --des-detail instead")
    // 把 badflag 参数的 shorthand 标记为即将废弃的,请用户使用 des-detail 的 shorthand 参数
    flag.CommandLine.MarkShorthandDeprecated("badflag", "please use -d instead")

    // 在帮助文档中隐藏参数 gender
    flag.CommandLine.MarkHidden("badflag")

    // 把用户传递的命令行参数解析为对应变量的值
    flag.Parse()

    fmt.Println("name=", *cliName)
    fmt.Println("age=", *cliAge)
    fmt.Println("gender=", *cliGender)
    fmt.Println("ok=", *cliOK)
    fmt.Println("des=", *cliDes)
}

shorthand
与 flag 包不同,在 pflag 包中,选项名称前面的 -- 和 - 是不一样的。- 表示 shorthand,-- 表示完整的选项名称。
除了最后一个 shorthand,其它的 shorthand 都必须是布尔类型的参数或者是具有默认值的参数。

//帮助文档中没有显示 badflag 的信息。其实在把参数标记为废弃时,同时也会设置隐藏参数。
cts@cts-pc:~/test$ ./test
name= nick
age= 22
gender= male
ok= false
des=
cts@cts-pc:~/test$
cts@cts-pc:~/test$ ./test -b=sssss
Flag shorthand -b has been deprecated, please use -d instead
Flag --badflag has been deprecated, please use --des-detail instead
name= nick
age= 22
gender= male
ok= false
des=
cts@cts-pc:~/test$ ./test --age=369
name= nick
age= 369
gender= male
ok= false
des=
cts@cts-pc:~/test$ ./test -a=369
name= nick
age= 369
gender= male
ok= false
des=
cts@cts-pc:~/test$ ./test -a
name= nick
age= 25
gender= male
ok= false
des=

 

posted @ 2021-02-01 15:45  牧 天  阅读(272)  评论(0)    收藏  举报