Go标准库-命令行程序传递参数|Go主题月

1,049 阅读2分钟

前言

我们可以在我们的Go程序运行前,通过命令行参数来给我们的程序传递参数。Go的标准库中flag包就提供了这样的封装实现。

Usage

简单来说,使用flag包的流程分为以下两步:

  1. 声明你要定义的参数的类型和名字。
  2. 使用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来返回参数切片。