在 Go语言中有很多种方法来处理命令行参数。如果我们只是想简单的获取命令行的参数,可以像Go语言–延迟调用defer、获取命令行参数、局部变量以及全局变量中介绍的不使用任何库,直接使用 os.Args;
d但是 Golang 的标准库提供了 flag 包来处理命令行参数。
导入包
import flag
flag参数类型
flag包支持的命令行参数类型有bool、int、int64、uint、uint64、float、float64、string、duration。
flag参数 | 有效值 |
---|---|
字符串flag | 合法字符串 |
整数flag | 1234、0664、0x1234等类型,也可以是负数。 |
浮点数flag | 合法浮点数 |
bool类型flag | 1, 0, t, f, T, F, true, false, TRUE, FALSE, True, False。 |
时间段flag | 可以接受任何可以被time.ParseDuration转换的参数 |
配置flag
func XXX(name string, value xxx, usage string) *xxx
func XXXVar(p *xxx, name string, value xxx, usage string)
- XXX为各个类型名,有:bool、duration、float64、int64、int、uint、uint64、string等.
- name string为flag名—name区分大小写
- value xxx为默认值
- usage string为帮助信息
- p *xxx为Type指针
即如下内容:
flag.Type(flag名, 默认值, 帮助信息)*Type
flag.TypeVar(Type指针, flag名, 默认值, 帮助信息)
两者区别
- 前者直接返回指向对应类型指针并分配对应指针指向的对象,可以直接通过解引用来获取转换后的对应值
- 后者需要指定指针指向的对象.
例如
定义姓名、年龄、婚否三个命令行参数:
name := flag.String("name", "张三", "姓名")
age := flag.Int("age", 18, "年龄")
married := flag.Bool("married", false, "婚否")
delay := flag.Duration("d", 0, "时间间隔")
此时name、age、married、delay均为对应类型的指针。
或者:
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, "d", 0, "时间间隔")
flag常用方法
Parse()
–设置完各种配置后调用此方法
用来实际触发转换的。底层实际上就是转换了命令行从第二个开始的所有参数。
- 如果有转换失败的情况,则会直接导致程序退出,并像标准输出打印错误原因。
- 如果输入的是-help或-h,且没有直接配置,则会输出使用帮助。
支持的命令行参数格式有以下几种:
-flag xxx (使用空格,一个-符号)
--flag xxx (使用空格,两个-符号)
-flag=xxx (使用等号,一个-符号)
--flag=xxx (使用等号,两个-符号)
其中,布尔类型的参数必须使用等号的方式指定。
Parsed()
–调用过Parse()进行转换后,Parsed()返回true,否则返回false
Args
处理完flag后,后面的参数都会当作普通参数处理。
- 可NArg()查看普通参数的个数;
- func Arg(i int) string来访问其中某个参数。
for i := 0; i < flag.NArg(); i++ {
fmt.Printf("%d:%s\n", i, flag.Arg(i))
}
- func Args() []string来一次性取回所有的参数。
for i, arg := range flag.Args() {
fmt.Printf("%d:%s\n", i, arg)
}
实例
package main
import (
"flag"
"fmt"
"time"
)
func main() {
//定义命令行参数方式1
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, "d", 0, "延迟的时间间隔")
//解析命令行参数
flag.Parse()
fmt.Println(name, age, married, delay)
//返回命令行参数后的其他参数
fmt.Println(flag.Args())
//返回命令行参数后的其他参数个数
fmt.Println(flag.NArg())
//访问其中某个参数
for i, arg := range flag.Args() {
fmt.Printf("%d:%s\n", i, arg)
}
//返回使用的命令行参数个数
fmt.Println(flag.NFlag())
}