flag 是Go 标准库提供的解析命令行参数的包。flag跟以往的传统命令行解析不同,它将参数定义, 参数默认值, 命令帮助, 参数读取集成到一起,摆脱以前繁琐的命令判断流程.
使用方式:
1
| flag.Type(name, defValue, usage)
|
其中Type为String, Int, Bool等;并返回一个相应类型的指针。
1
| flag.TypeVar(&flagvar, name, defValue, usage)
|
将flag绑定到一个变量上。
##返回指针
通过flag.String, flag.Int, flag.Bool等可以直接返回一个参数指针,因此后续使用的时候需要加*进行取值:
1 2
| str = flag.String("mystring", "default-value", "mystring is my test flag of String") i = flag.Int("myint", 123, "test int flag")
|
##序列化到变量
通过flag.StringVar, flag.IntVar, flag.BoolVar等,可以直接把值序列化到变量:
1 2
| flag.StringVar(&vStr, "mystring2", "default-value2", "mystring2 is my test flag of String") flag.IntVar(&vI, "myint2", 123, "test int flag")
|
自定义flag
只要实现flag.Value接口即可:
1 2 3 4
| type Value interface { String() string Set(string) error }
|
通过如下方式定义该flag:
1
| flag.Var(&flagvar, name, usage)
|
example:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| package main import( "flag" "fmt" "strconv" ) type percentage float32 func (p *percentage) Set(s string) error { v, err := strconv.ParseFloat(s, 32) *p = percentage(v) return err } func (p *percentage) String() string { return fmt.Sprintf("%f", *p) } func main() { namePtr := flag.String("name", "yang", "user's name") agePtr := flag.Int("age", 20, "user's age") vipPtr := flag.Bool("vip", true, "is a vip user") var email string flag.StringVar(&email, "email", "xxxxxx@gmail.com", "user's email") var pop percentage flag.Var(&pop, "pop", "popularity") flag.Parse() others := flag.Args() fmt.Println("name:", *namePtr) fmt.Println("age:", *agePtr) fmt.Println("vip:", *vipPtr) fmt.Println("pop:", pop) fmt.Println("email:", email) fmt.Println("other:", others) }
|
输出:
1 2 3 4 5 6
| $ go run test.go name: yang age: 20 vip: true email: xxxxxx@gmail.com other: []
|
1 2 3 4 5 6 7
| $ go run test.go -name golang -age 4 -vip=true -pop 99 简洁 高并发 等等 name: golang age: 4 vip: true pop: 99 email: lyhopq@gmail.com other: [简洁 高并发 等等]
|
1 2 3 4 5 6 7
| $ go run test.go -h Usage of go /var/folders/6y/z4y473d12fj8ss2gkr276dx80000gn/T/go-build217780999/command-line-arguments/_obj/exe/test : -age=20: user's age -email="xxxxxx@gmail.com": user's email -name="yang": user's name -pop=0.0: popularity -vip=true: is a vip user
|
pflag
pflag是flag扩展,主要是加入了对短参数的支持.
安装
1
| go get github.com/ogier/pflag
|
测试
1
| go test github.com/ogier/pflag
|
使用
如果你之前已经import了flag包,那么直接把那行改为:
1
| import flag "github.com/ogier/pflag"
|
短参数支持
在函数后面加上P即可:
1 2
| pflag.StringVarP(&p1, "stringflag", "s", "test-p-flag-string", "test pflag for string.") pflag.IntVarP(&p2, "intflag", "i", 12345, "test pflag for int.")
|
程序运行结果
1 2 3 4 5
| $ go run main.go Usage of /private/var/folders/98/pmb6b_8x5w5319m9ts6h6z6m0000gn/T/Build main.go and run1go: -i, --intflag=12345: test pflag for int. -s, --stringflag="test-p-flag-string": test pflag for string.
|