flag包 —— 解析命令行参数

我们通过io包,知道golang使用os.Args来接收命令行参数,在简单的场景下os.Args基本够我们使用。 复杂的参数场下golang提供flag包来解析命令行参数。

参数格式

-flag  //只支持布尔类型,有为true,无为默认值
-flag=x
-flag x  // bool型不能用这个方式

参数中带---功能一致,例如cmd -a 3cmd --a 3是一致的。

定义flag接收参数的两种方式

  1. 接收指针

例如 flag.String(), flag.Bool(), flag.Int()

func Int(name string, value int, usage string) *int
func Bool(name string, value bool, usage string) *bool
func String(name string, value string, usage string) *string

这类函数,name是参数名,value为默认值,usage为帮助信息-h的时候会打印,返回值为指针类型。

import "flag"
var nFlag = flag.Int("n", 1234, "help message for flag n")

fmt.Println(*nFlag) //指针类型用使用需要 *符号
  1. 参数绑定

例如flag.IntVar(),flag.StringVar(),flag.BoolVar()

func IntVar(p *int, name string, value int, usage string)
func BoolVar(p *bool, name string, value bool, usage string)
func StringVar(p *string, name string, value string, usage string)

这类函数,p为需要的绑定的指针,name是参数名,value为默认值,usage为帮助信息-h的时候会打印。

var flagvar int
flag.IntVar(&flagvar, "flagname", 1234, "help message for flagname")
fmt.Println(flagvar)

flag.Parse()

所以的参数能够解析一定要调用flag.Parse()flag.Parse()调用后才开始做参数解析。

例子

package main

import (
	"flag"
	"fmt"
)

func main() {

	var a int
	var b bool
	var c string

	flag.IntVar(&a, "i", 0, "int flag value")
	flag.BoolVar(&b, "b", false, "bool flag value")
	flag.StringVar(&c, "s", "default", "string flag value")
	flag.Parse()

	fmt.Println("a:", a)
	fmt.Println("b:", b)
	fmt.Println("c:", c)
}
$ ./cmd -h    #打印帮助信息
Usage of ./cmd:
  -b    bool flag value
  -i int
        int flag value
  -s string
        string flag value (default "default")

$ ./cmd -i 1 -b -s="acb"
a: 1
b: true
c: acb

参考资料

go pkg flag