Go语言内置的flag包实现了命令行参数的解析,flag包使得开发命令行工具更为简单。

os.Args

os.Args可以简单获取命令行参数。

1
2
3
4
5
6
func main() {
//os.Args 是一个[]string
fmt.Printf("%#v\n", os.Args)
fmt.Println(os.Args[0], os.Args[2])
fmt.Printf("%T\n", os.Args)
}

编译后执行:

1
2
3
4
5
6
06osargs>06osargs.exe a b c

[]string{"06osargs.exe", "a", "b", "c"}
06osargs.exe b
[]string

os.Args是一个储存命令行参数的字符串切片,它的第一个参数是执行文件的名称。

flag包的基本使用

flag参数类型

flag包支持的命令行参数类型有:bool, int, int64, uint, unit64, float, float64, string, duration

flag参数 有效值
bool 1, 0, t, f, T, F, true, false, TRUE, FALSE, True, False
int 1234、0664、0x1234等类型,也可以是负数
string 合法字符串
Duration 任何合法的时间段字符串。如”300ms”、”-1.5h”、”2h45m”。
合法的单位有”ns”、”us” /“µs”、”ms”、”s”、”m”、”h”。
Float64 合法浮点数

定义命令行flag参数

1、flag.Type()

1
flag.Type(flag名, 默认值, 帮助信息)*Type

Example:

1
2
3
4
name := flag.String("name", "张三", "姓名")
age := flag.Int("age", 18, "年龄")
married := flag.Bool("married", false, "婚否")
delay := flag.Duration("delay", time.Second, "时间间隔")

name, age, maried, delay均为指针类型。

2、flag.TypeVar()

1
flag.TypeVar(Type指针, flag名, 默认值, 帮助信息)

Example:

1
2
3
4
5
6
7
8
9
var name string
var age int
var married bool
var delay time.Duration

flag.StringVar(&name, "name", "张三", "姓名")
flag.IntVar(&age, "age", 18, "年龄")
flag.BoolVar(&married, "married", false, "婚否")
flag.DurationVar(&delay, "delay", time.Second, "时间间隔")

flag.Parse()

通过以上两种方式定义好命令行flag参数后,需要调用flag.Parse()来对命令参数进行解析。

支持的命令参数格式:

  • -flag xxx
  • --flag xxx
  • -flag=xxx
  • --flag=xxx

布尔类型的参数必须使用等号方式指定。

flag解析第一个非flag参数之前。

flag其他函数

1
2
3
4
5
6
//返回命令函参数后的其他参数,以[]string类型
fmt.Println(flag.Args())
//返回命令行参数后的其他参数个数
fmt.Println(flag.NArg())
//返回使用的命令行参数个数
fmt.Println(flag.NFlag())