Using Command Line Flags in Go
Go有很多方式去处理CLIflags,第一种方式就是不适用任何库,使用os.Args检测。第二种方式是去使用标准库flag,第三种方式就是使用众多第三方CLI库之一,比如Cobra。
这次的内容主要讨论第二种方式,使用标准库flag,因为它在os.Args之上提供了诸多未处理的语法分析的便利,它还是内建的。在使用前 import "flag"
接受一个int类型参数:
func Int(name string, value int, usage string) *int var count = flag.Int("count", 5, "the count of items") fmt.Println("count value ", *count)
第一个参数是flag名字当使用在CLI中,第二个参数是默认值,第三个对于该参数的描述
flag.IntVar()提供了一种可以替换的语法
func IntVar(p *int, name string, value int, usage string) var count int flag.IntVar(&count, "count", 5, "the count of items") fmt.Println("count value ", count)
这里参数发生了变化,第一个参数变成了变量的引用
两者主要的差别就是第一个用例中你得到的是一个指针,第二个用例你得到的是一个值
flag提供了许多方法去分析不同的flag类型,你可以用他们处理每一种你想接受的类型。
func Bool(name string, value bool, usage string) *bool func BoolVar(p *bool, name string, value bool, usage string) func Duration(name string, value time.Duration, usage string) *time.Duration func DurationVar(p *time.Duration, name string, value time.Duration, usage string) func Float64(name string, value float64, usage string) *float64 func Float64Var(p *float64, name string, value float64, usage string) func Int(name string, value int, usage string) *int func Int64(name string, value int64, usage string) *int64 func Int64Var(p *int64, name string, value int64, usage string) func IntVar(p *int, name string, value int, usage string) func String(name string, value string, usage string) *string func StringVar(p *string, name string, value string, usage string) func Uint(name string, value uint, usage string) *uint func Uint64(name string, value uint64, usage string) *uint64 func Uint64Var(p *uint64, name string, value uint64, usage string) func UintVar(p *uint, name string, value uint, usage string)
传递错误的数据类型会引发error,暂停程序,还会将所需的用法打印给用户。
如何去设置flag?
只需要将- flagname加入到CLI命令中,有四种等效的语法:
-count=x -count x --count=x --count x
你可以向命令传递任意数量的flag,但是如果flag包认不出你传递的flag它也会对停止对其它flag的解析,这意味着如果你还有其他非flag的参数,一定要在开始时,先使用所有的flag参数,避免flag包停止解析。
解析flags:
在你定义好所有的flags之后,你需要去调用
flag.Parse()
这样才能真正的解析他们
Boolean flags
Boolean flags设置的方法很简单,只需要加-count,这会让boollean flag得到true的值,如果设置false的值,可以使用-count=false。下面的值用于设置boolean flags都是有效的:
1, 0, t, f, T, F, true, false, TRUE, FALSE, True, False.
在实际生产环境中,许多时候经常会看到CIL应用接受一个带有描述性名称的标志,以及同一个带有字母缩写的标志,你可以通过提供两个handler来实现:
var gopherType string
func init() { const ( defaultGopher = "pocket" usage = "the variety of gopher" ) flag.StringVar(&gopherType, "gopher_type", defaultGopher, usage) flag.StringVar(&gopherType, "g", defaultGopher, usage+" (shorthand)") }
what's next?
下一步还能做什么,你可以更深层次的去研究下去,像别的CLI命令那样,开发一些子命令,甚至还可以开发一个简单的CLI工具通过Go语言。