欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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
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这部分