pflag flag

定义flags
import “flag”



// 返回的是 指针
var ip = flag.Int(“flagname”, 1234, “help message for flagname”)
将flag绑定到一个变量
var flagvar int
flag.IntVar(&flagvar, “flagname”, 1234, “help message for flagname”)
绑定自定义的类型
import “flag”



// 自定义类型需要实现value接口
flag.Var(&flagVal, “name”, “help message for flagname”)
flag解析
// 解析函数将会在碰到第一个非flag命令行参数时停止
flag.Parse()
命令行参数的格式
-flag xxx (使用空格,一个 - 符号)
–flag xxx (使用空格,两个 - 符号)
-flag=xxx (使用等号,一个 - 符号)
–flag=xxx (使用等号,两个 - 符号)

https://github.com/spf13/pflag



Docker源码中使用了Pflag。



安装spf13/pflag
go get github.com/spf13/pflag
使用spf13/pflag
基本的使用和“flag包”基本相同



新增:



添加shorthand参数
// func IntP(name, shorthand string, value int, usage string) *int
// IntP is like Int, but accepts a shorthand letter that can be used after a single dash.
var ip= flag.IntP(“flagname”, “f”, 1234, “help message”)
设置非必须选项的默认值
var ip = flag.IntP(“flagname”, “f”, 1234, “help message”)
flag.Lookup(“flagname”).NoOptDefVal = “4321”



结果如下图:



Parsed Arguments Resulting Value
–flagname=1357 ip=1357



命令行语法
–flag // 布尔flags, 或者非必须选项默认值
–flag x // 只对于没有默认值的flags
–flag=x
flag定制化
例如希望使用“-”,“_”或者“.”,像–my-flag == –my_flag == –my.flag:



func wordSepNormalizeFunc(f *pflag.FlagSet, name string) pflag.NormalizedName {
from := []string{“-“, “_”}
to := “.”
for _, sep := range from {
name = strings.Replace(name, sep, to, -1)
}
return pflag.NormalizedName(name)
}



myFlagSet.SetNormalizeFunc(wordSepNormalizeFunc)
例如希望联合两个参数,像–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)
弃用flag或者它的shothand



弃用flag或者它的shothand
例如希望弃用名叫badflag参数,并告知开发者使用代替参数:



// deprecate a flag by specifying its name and a usage message
flags.MarkDeprecated(“badflag”, “please use –good-flag instead”)
从而当使用badflag时,会提示Flag –badflag has been deprecated, please use –good-flag instead



例如希望保持使用noshorthandflag,但想弃用简称n:



// deprecate a flag shorthand by specifying its flag name and a usage message
flags.MarkShorthandDeprecated(“noshorthandflag”, “please use –noshorthandflag only”)
从而当使用n时,会提示Flag shorthand -n has been deprecated, please use –noshorthandflag only



隐藏flag
例如希望保持使用secretFlag参数,但在help文档中隐藏这个参数的说明:



// hide a flag by specifying its name
flags.MarkHidden(“secretFlag”)



关闭flags的排序
例如希望关闭对help文档或使用说明的flag排序:



flags.BoolP(“verbose”, “v”, false, “verbose output”)
flags.String(“coolflag”, “yeaah”, “it’s really cool flag”)
flags.Int(“usefulflag”, 777, “sometimes it’s very useful”)
flags.SortFlags = false
flags.PrintDefaults()
输出:



-v, –verbose verbose output
–coolflag string it’s really cool flag (default “yeaah”)
–usefulflag int sometimes it’s very useful (default 777)
同时使用flag包和pflag包
import (
goflag “flag”
flag “github.com/spf13/pflag”
)



var ip *int = flag.Int(“flagname”, 1234, “help message for flagname”)



func main() {
flag.CommandLine.AddGoFlagSet(goflag.CommandLine)
flag.Parse()
}


Category golang