pflag如何使用

时间:2023-03-09 00:59:56
pflag如何使用

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

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

2 安装

go get github.com/spf13/pflag

3 我自己写的例子

 package main

 import (
"github.com/spf13/pflag"
"net"
"fmt"
"time"
) func pflagDefine() {
//64位整数,不带单标志位的
var pflagint64 *int64 = pflag.Int64("number1", , "this is int 64, without single flag") //64位整数,带单标志位的
var pflagint64p *int64 = pflag.Int64P("number2", "n", , "this is int 64, without single flag") //这种可以把变量的定义和变量取值分开,适合于struct,全局变量等地方
var pflagint64var int64
pflag.Int64Var(&pflagint64var, "number3", , "this is int64var") //上面那一种的增加短标志位版
var pflagint64varp int64
pflag.Int64VarP(&pflagint64varp,"number4", "m", , "this is int64varp") //slice版本,其实是上面的增强版,但是支持多个参数,也就是导成一个slice
var pflagint64slice *[]int64 = pflag.Int64Slice("number5", []int64{, }, "this is int64 slice") //bool版本
var pflagbool *bool = pflag.Bool("bool", true, "this is bool") //bytes版本
var pflagbyte *[]byte = pflag.BytesBase64("byte64", []byte("ea"), "this is byte base64") //count版本
var pflagcount *int= pflag.Count("count", "this is count") //duration版本
var pflagduration *time.Duration = pflag.Duration("duration", * time.Second, "this is duration") //float版本
var pflagfloat *float64 = pflag.Float64("float64", 123.345, "this is florat64") //IP版本
var pflagip *net.IP = pflag.IP("ip1", net.IPv4(, , , ), "this is ip, without single flag") //mask版本
var pflagmask *net.IPMask= pflag.IPMask("mask", net.IPv4Mask(,,,),"this is net mask") //string版本
var pflagstring *string= pflag.String("string", "teststring", "this is string") //uint版本
var pflaguint *uint64 = pflag.Uint64("uint64", , "this is uint64") pflag.Parse()
fmt.Println("number1 int64 is ", *pflagint64)
fmt.Println("number2 int64 is ", *pflagint64p)
fmt.Println("number3 int64var is ", pflagint64var)
fmt.Println("number4 int64varp is", pflagint64varp)
fmt.Println("number5 int64slice is", *pflagint64slice)
fmt.Println("bool is ", *pflagbool)
fmt.Println("byte64 is ", *pflagbyte)
fmt.Println("count is ", *pflagcount)
fmt.Println("duration is ", *pflagduration)
fmt.Println("float is ", *pflagfloat)
fmt.Println("ip1 net.ip is ", *pflagip)
fmt.Println("mask is %s", *pflagmask)
fmt.Println("string is ", *pflagstring)
fmt.Println("uint64 is ", *pflaguint) } func main() {
pflagDefine() }

说几个要点:

(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

 func aliasNormalizeFunc(f *pflag.FlagSet, name string) pflag.NormalizedName {

 switch name {
case "old-flag-name":
name = "new-flag-name"
break
}
return pflag.NormalizedName(name)
} myFlagSet.SetNormalizeFunc(aliasNormalizeFunc)

9 替换原生的flag

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

 import (
goflag "flag"
flag "github.com/spf13/pflag"
) var ip *int = flag.Int("flagname", , "help message for flagname") func main() {
flag.CommandLine.AddGoFlagSet(goflag.CommandLine)
flag.Parse()
}

核心是import这部分