美文网首页
05-18golang中pflag

05-18golang中pflag

作者: 文茶君 | 来源:发表于2021-05-18 17:37 被阅读0次

    参考
    github spf13/pflag
    Golang之使用Flag和Pflag
    Golang命令行参数解析库源码分析:flag VS pflag
    Golang : pflag 包简介

    pflag 包的主要特点
    pflag 包与 flag 包的工作原理甚至是代码实现都是类似的,下面是 pflag 相对 flag 的一些优势:

    • 支持更加精细的参数类型:例如,flag 只支持 uint 和 uint64,而 pflag 额外支持 uint8、uint16、int32 等类型。
    • 支持更多参数类型:ip、ip mask、ip net、count、以及所有类型的 slice 类型。
    • 兼容标准 flag 库的 Flag 和 FlagSet:pflag 更像是对 flag 的扩展。
    • 原生支持更丰富的功能:支持 shorthand、deprecated、hidden 等高级功能。
    安装 pflag 包

    本文介绍 doker 源代码中引用的 pflag 包 github.com/spf13/pfla,用下面的命令安装该包:

    $ 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)
        
        // 为 age 参数设置 NoOptDefVal
        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)
    }
    
    

    这段代码和官方代码类似,详细信息可以参考Golang之使用Flag和Pflag
    以一段代码来叙述:

    var cliAge = flag.IntP("age", "a",22, "Input Your Age")
    

    在这里flag.IntP("age", "a",22, "Input Your Age")有四个参数,(name,shorthand,value,usage)就是名称,即命令行输入是
    --name=xxx,shorthand是与官方原本的flag不同的一点,就是简写,可以写成
    -shorthand=xx,用代码中的就是-a=xxx,value不用就说,就是默认值,提一下,pflag还有一个NoOptDefVal ,pflag 包支持通过简便的方式为参数设置默认值之外的值,实现方式为设置参数的 NoOptDefVal 属性:

    var cliAge = flag.IntP("age", "a",22, "Input Your Age")
    flag.Lookup("age").NoOptDefVal = "25"
    

    就是可以设置两个值
    最后就是信息,用于提示
    这个用这个就是,贴下我的部分代码

    var N =flag.IntP("cycles","N",10,"Cycles per second")
        var M =flag.IntP("logSize","M",1,"Output log size")
        func Init(){
    
        }
    
    func main() {
    
        var b = 0
        flag.Parse()
    
    
     ./study -N=30,-M=3
    invalid argument "30,-M=3" for "-N, --cycles" flag: strconv.ParseInt: parsing "30,-M=3": invalid syntax
    Usage of ./study:
      -N, --cycles int    Cycles per second (default 10)
      -M, --logSize int   Output log size (default 1)
    invalid argument "30,-M=3" for "-N, --cycles" flag: strconv.ParseInt: parsing "30,-M=3": invalid syntax
    
    
    

    在这里提一下,必须要加flag.Parse(),才会解析命令行传回的数据

    相关文章

      网友评论

          本文标题:05-18golang中pflag

          本文链接:https://www.haomeiwen.com/subject/onlyjltx.html