前言
我们可以在我们的Go程序运行前,通过命令行参数来给我们的程序传递参数。Go的标准库中flag包就提供了这样的封装实现。
Usage
简单来说,使用flag包的流程分为以下两步:
- 声明你要定义的参数的类型和名字。
- 使用
flag.Parse()
对参数进行解析。
例如如下的代码
func main() {
param := flag.String("name","","the name value")
param2 := flag.Int("age",0,"the age value")
flag.Parse()
fmt.Printf("My name is %s, and I am %s years old.", param, param2)
}
我们可以使用./demo.go -s aaa -i 100
,那么程序就可以获取到传入的两个参数并打印出来。
另外,我们可以使用-h
参数来输出usage:
$./demo.go -h
Usage of ./demo:
-age int
年龄 (default 0)
-name string
姓名 (default "")
Type/TypeVar
在flag包中通常包含对不同类型的两种赋值方式, 以Int
类型为例:
func IntVar(p *int, name string, value int, usage string) {
CommandLine.Var(newIntValue(value, p), name, usage)
}
func (f *FlagSet) Int(name string, value int, usage string) *int {
p := new(int)
f.IntVar(p, name, value, usage)
return p
}
区别在于,flag.XXX()
方法可以返回接收到的参数值,而flag.XXXVar()
是将参数值绑定到已经声明好的变量当中。需要注意的是,绑定到变量中的值需要传入的是指针类型,并且返回的参数值也是指针类型。
这里有个坑,不能根据值是否为nil来判断是否传递了该参数,而应该根据值来判断你的业务逻辑
Args
func (f *FlagSet) NArg() int
NArg返回解析flag之后剩余参数的个数。
func (f *FlagSet) Args() []string
返回解析之后剩下的非flag参数。(不包括命令名)
func (f *FlagSet) Arg(i int) string
返回解析之后剩下的第i个参数,从0开始索引。
flag
包中的Args
类参数的使用和os.Args
大体相同,在一些简单场景中,可以使用os.Args来返回参数切片。