pflag如何使用
程序员文章站
2022-04-28 11:10:00
1 为何我对这个库感兴趣呢? 因为我想看看Kubernetes的源码,Kubernetes,Hugo啥的都是那这个解析的命令行参数 2 安装 go get github.com/spf13/pflag 3 我自己写的例子 说几个要点: (1)Int64P比Int64多的是一个短标志位,注意:这里只能 ......
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 |
--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这部分
上一篇: 常用代码杂记