pflag
大约 2 分钟
我在标准库中介绍了flag使用,对于小型的项目flag能够基本满足需求,但是在某些大型项目或者特殊场景下flag有些力不从心。主要在于:
- flag的子命令需要自己解析
- flag的短命令需要定义两个变量
- 不支持一些参数废弃说明,这在更新的工具中对用户有更好的引导作用
因此业界开源的pflag受到广大爱好者的使用,在一些耳熟能详的开源项目里也都在使用pflag,例如:Kubernetes、Istio、Helm、Docker、Etcd等。
简单用法
支持标准库flag用法
var flagStrA = pflag.String("str-a", "str-a", "flag test *string")
使用示例:
func ExampleFlagLongStringPoint() {
pflag.CommandLine.Parse([]string{"--str-a", "stra"})
fmt.Println(*flagStrA)
// Output:
// stra
}
注意
注意是长选项,即参数为--xxx
支持短选项
var flagStrB = pflag.StringP("str-b", "b", "str-b", "long and short flag test *string")
使用示例:
func ExampleFlagShortStringPoint() {
pflag.CommandLine.Parse([]string{"-b", "strb"})
fmt.Println(*flagStrB)
// OutPut:
// strb
}
支持绑定到已有变量
var flagStrC string
var flagStrD string
func init() {
pflag.StringVar(&flagStrC, "str-c", "str-c", "long flag test string")
pflag.StringVarP(&flagStrD, "str-d", "d", "str-d", "long and short flag test string")
}
使用示例:
func ExampleFlagString() {
pflag.CommandLine.Parse([]string{"--str-c", "strc", "-d", "strd"})
fmt.Println(flagStrC, flagStrD)
// Output:
// strc strd
}
标记命令行参数已废弃
pflag.CommandLine.MarkDeprecated("badflag", "please use --desc instead")
pflag.CommandLine.MarkShorthandDeprecated("str-b", "please use --str-b instead")
打印Usage()
Flag --badflag has been deprecated, please use --desc instead
Flag shorthand -b has been deprecated, please use --str-b instead
指定了参数却没有传值场景下的默认值改写
var age = pflag.IntP("age", "a", 30, "Input Your Age")
func init() {
pflag.Lookup("age").NoOptDefVal = "25"
}
使用示例:
func TestFlagDefault(t *testing.T) {
tests := []struct {
name string
arguments []string
want int
}{
{name: "没传入参数和值", arguments: []string{""}, want: 30},
{name: "传入参数和值", arguments: []string{"--age=10"}, want: 10},
{name: "传入参数,没传值", arguments: []string{"--age"}, want: 25},
}
for _, test := range tests {
pflag.CommandLine.Parse(test.arguments)
if *age != test.want {
t.Fatalf("%s pflag parse want:%d,but got:%d", test.name, test.want, *age)
}
}
}
::: notice
- 当输入--age 10,age变量值为:10;
- 当输入--age,age变量值为:25;
- 当没输入--age,age变量值为:30;
:::
支持隐藏参数
隐藏的参数不会显示在usage/help中
pflag.CommandLine.MarkHidden("secretFlag")