Go标准库flag包基础用法
Go语言内置的flag包实现了命令行参数的解析,flag包使得开发命令行工具更为简单。说白了就是命令行输入命令后面的那个参数的解析。
os.Args
如果只是简单的随便带一个参数用os.Args
就行。要使用os.Args
先引入os
包。os.Args
是一个[]string
字符串切片。
func main() {
if len(os.Args) > 0 {
for i, v := range os.Args {
fmt.Printf("遍历os.Args切片:\n os.Args[%d]='%s'\n", i, v)
}
}
}
上面代码输入go run main.go abcd bbs
后运行结果如下:
☁ go run main.go abcd bbs
遍历os.Args切片:
os.Args[0]=’/data/data/com.termux/files/usr/tmp/go-build002182286/b001/exe/main’
遍历os.Args切片:
os.Args[1]=’abcd’
遍历os.Args切片:
os.Args[2]=’bbs’
os.Args
是一个切片,第一个元素也就是索引是0
的那个元素保存的是路径,程序所在的路径。其它元素和输入命令时的参数一一对应。比如索引为1
的第二个元素就是abcd
了。使用方便,简单。功能略少。
flag包的基本使用
flag包基本使用:这里简单介绍一下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 | 任何合法的时间段字符串。如”300ms”、”-1.5h”、”2h45m”。合法的单位有”ns”、”us” /“µs”、”ms”、”s”、”m”、”h”。 |
定义falg命令行参数
定义falg命令行参数,有两种常用的定义flag
命令行参数的方法
flag.Type()基本格式如下:
flag.Type(flag名,默认值,帮助信息)*Type
例如要定义name
,age
,married
,delay
四个参数:
name := flag.String("name","铁锤","姓名")
age := flag.Int("age",18,"年龄")
married := flag.Bool("married",false,"婚否")
delay := flag.Duration("d",1h30m59s,"时间间隔")
注意,这里的name
,age
,married
,delay
都是对应类型的指针。
flag.TypeVar()
flag.TypeVar()
定义命令行参数,首先声明一个存储参数数据的变量,然后使用
flag.Type('Type指针','参数名','参数默认值','帮助信息')
例如要定义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",true,"婚否")
flag.DurationVar(&delay,"delay",1h30m58s,"时间间隔")
命令行参数的解析
通过以上方法定义好命令行参数以后,需要使用flag.Parse()
来对参数解析。支持命令行参数格式有一下几种:
- -flag xxx
- –flag xxx
- -flag=xxx
- –flag=xxx
其中,布尔类型的参数必须使用等号的方式指定。
Flag解析在第一个非flag参数(单个”-“不是flag参数)之前停止,或者在终止符”-“之后停止。
完整示例:
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())
//返回使用的命令行参数个数
fmt.Println(flag.NFlag())
}
flag其他函数简单介绍:
- flag.Args()
返回命令行参数后的其他参数,以[]string
类型 - flag.NArg()
返回命令行参数后的其他参数个数 - flag.NFlag()
返回使用的命令行参数个数
help使用:
☁ flag go run main.go -help
运行结果:
Usage of /data/data/com.termux/files/usr/tmp/go-build113043422/b001/exe/main:
-age int
年龄 (default 18)
-d duration
时间间隔
-married
婚否
-name string
姓名 (default “张三”)
exit status 2
正常使用flag参数:
☁ flag go run main.go -age 38 --name 二蛋 -married=false --d=3h18m2s
运行结果:
二蛋 38 false 3h18m2s
[]
0
4
注意如下写法:
☁ flag go run main.go -name aa kdlf skdh -age 20
运行结果:
aa 18 false 0s
[kdlf skdh -age 20]
4
1
flag在遇到第一个非flag参数时停止解析。所以-name aa
能正确识别解析,kdlf
是错误的写法,flag不能识别,解析停止,后面的-age 20
虽然写法正确,但是不能识别了。
完整实例代码:
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())
//返回使用的命令行参数个数
fmt.Println(flag.NFlag())
}