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语言。
reference
有疑问加站长微信联系(非本文作者)