• pflag如何使用


    1 为何我对这个库感兴趣呢?

    因为我想看看Kubernetes的源码,Kubernetes,Hugo啥的都是那这个解析的命令行参数

    2 安装

    go get github.com/spf13/pflag

    3 我自己写的例子

     1 package main
     2 
     3 import (
     4    "github.com/spf13/pflag"
     5    "net"
     6    "fmt"
     7    "time"
     8 )
     9 
    10 func pflagDefine() {
    11    //64位整数,不带单标志位的
    12    var pflagint64 *int64 = pflag.Int64("number1", 1234, "this is int 64, without single flag")
    13 
    14    //64位整数,带单标志位的
    15    var pflagint64p *int64 = pflag.Int64P("number2", "n", 2345, "this is int 64, without single flag")
    16 
    17     //这种可以把变量的定义和变量取值分开,适合于struct,全局变量等地方
    18    var pflagint64var int64
    19    pflag.Int64Var(&pflagint64var, "number3", 1234, "this is int64var")
    20 
    21    //上面那一种的增加短标志位版
    22    var pflagint64varp int64
    23    pflag.Int64VarP(&pflagint64varp,"number4", "m", 1234, "this is int64varp")
    24 
    25 
    26 
    27     //slice版本,其实是上面的增强版,但是支持多个参数,也就是导成一个slice
    28     var pflagint64slice *[]int64 = pflag.Int64Slice("number5", []int64{1234, 3456}, "this is int64 slice")
    29 
    30     //bool版本
    31     var pflagbool *bool = pflag.Bool("bool", true, "this is bool")
    32 
    33     //bytes版本
    34     var pflagbyte *[]byte = pflag.BytesBase64("byte64", []byte("ea"), "this is byte base64")
    35 
    36     //count版本
    37     var pflagcount *int= pflag.Count("count", "this is count")
    38 
    39     //duration版本
    40     var pflagduration *time.Duration = pflag.Duration("duration", 10* time.Second, "this is duration")
    41 
    42     //float版本
    43     var pflagfloat *float64 = pflag.Float64("float64", 123.345, "this is florat64")
    44 
    45     //IP版本
    46    var pflagip *net.IP = pflag.IP("ip1", net.IPv4(192, 168, 1, 1), "this is ip, without single flag")
    47 
    48    //mask版本
    49     var pflagmask *net.IPMask= pflag.IPMask("mask", net.IPv4Mask(255,255,255,128),"this is net mask")
    50 
    51    //string版本
    52     var pflagstring *string= pflag.String("string", "teststring", "this is string")
    53 
    54    //uint版本
    55    var pflaguint *uint64 = pflag.Uint64("uint64", 12345, "this is uint64")
    56 
    57    pflag.Parse()
    58    fmt.Println("number1 int64 is ", *pflagint64)
    59    fmt.Println("number2 int64 is ", *pflagint64p)
    60    fmt.Println("number3 int64var is ", pflagint64var)
    61    fmt.Println("number4 int64varp is", pflagint64varp)
    62    fmt.Println("number5 int64slice is", *pflagint64slice)
    63     fmt.Println("bool is ", *pflagbool)
    64     fmt.Println("byte64 is ", *pflagbyte)
    65     fmt.Println("count is ", *pflagcount)
    66     fmt.Println("duration is ", *pflagduration)
    67     fmt.Println("float is ", *pflagfloat)
    68    fmt.Println("ip1 net.ip is ", *pflagip)
    69     fmt.Println("mask is %s", *pflagmask)
    70     fmt.Println("string is ", *pflagstring)
    71    fmt.Println("uint64 is ", *pflaguint)
    72 
    73 }
    74 
    75 func main() {
    76    pflagDefine()
    77 
    78 }

    说几个要点:

    (1)Int64P比Int64多的是一个短标志位,注意:这里只能是一个字母

    (2)pflagint64var比pflagint64多的是,可以导入一个指针参数而不是赋值。

    这样的好处:可以把一些全局变量导入了,先声明,后导入

                         可以把struct导入了。

    4 默认值

    我们有两种默认值,一种是不使用这个标志位的时候默认值,另外一种是声明使用这个标志位,但是不赋值,这种对应的是NoOptDefVal。

    Parsed Arguments

    Parsed Arguments
    Resulting Value

    --flagname=1357 ip=1357
    --flagname ip=4321
    [nothing] ip=1234

    5 放弃标志位

    flags.MarkDeprecated("badflag", "please use --good-flag instead")

    还告诉了用户,新的标志位是啥

    6 放弃短标志位

    flags.MarkShorthandDeprecated("noshorthandflag", "please use --noshorthandflag only")

    只放弃短的,长标志位依然可以使用

    7 隐藏一个标志位

    flags.MarkHidden("secretFlag")

    所以,没有文档字符串了

    8 多标志位

     --old-flag-name == --new-flag-name

     1 func aliasNormalizeFunc(f *pflag.FlagSet, name string) pflag.NormalizedName {
     2 
     3 switch name {
     4 case "old-flag-name":
     5 name = "new-flag-name"
     6 break
     7 }
     8 return pflag.NormalizedName(name)
     9 }
    10 
    11 myFlagSet.SetNormalizeFunc(aliasNormalizeFunc)

    9 替换原生的flag

    完美兼容原生的,只需要改动一点点,你就可以用这个库了

     1 import (
     2         goflag "flag"
     3         flag "github.com/spf13/pflag"
     4 )
     5 
     6 var ip *int = flag.Int("flagname", 1234, "help message for flagname")
     7 
     8 func main() {
     9         flag.CommandLine.AddGoFlagSet(goflag.CommandLine)
    10         flag.Parse()
    11 }

    核心是import这部分

  • 相关阅读:
    春招已近,这份GitHub万星的ML算法面试大全请收下
    [资源推荐] 必须收藏的两个查找论文和代码实现的网站!
    windows下安装pycocotools,亲测有效!
    GAN原理
    2018-07-02
    虚函数和纯虚函数
    友元
    string字符串
    实参和形参
    C/C++学习笔记汇总
  • 原文地址:https://www.cnblogs.com/fxdjjn/p/10535128.html
Copyright © 2020-2023  润新知