Go命令行参数解析|“立个flag”
前言
业务脚本经常需要动态指定一些参数,来满足业务场景使用。Go语言内置了flag包
实现了命令行参数的解析,简单易用。本文先快速过一遍flag包的使用,然后结合案例“立个flag”加深理解与使用。
参数定义
支持的参数类型
包括:bool
、int
、int64
、uint
、uint64
、float32
float64
、string
、duration
做个分类:
- 布尔类型flag:有效值为1, 0, t, f, T, F, true, false, TRUE, FALSE, True, False
- 整数flag:有效值为1234、0664、0x1234等类型,也可以是负数
- 浮点数flag:有效值为合法浮点数
- 字符串flag :有效值为合法字符串
- 时间段flag:有效值为任何合法的时间段字符串。如”300ms”、”-1.5h”、”2h45m”。合法的单位有”ns”、”us” /“µs”、”ms”、”s”、”m”、”h”
两种定义方式
方式 1:flag.Type
基本格式(Type代指类型):
flag.Type(flag名, 默认值, 帮助信息) *Type //返回值为对应类型的指针
代码示例(定义3个参数 name age target):
name := flag.String("name", "劲仔", "姓名")
age := flag.Int("age", 18, "年龄")
target := flag.String("target", "保卫世界和平", "目标")
需要注意:此时name
、age
、target
均为对应类型的指针
方式 2:flag.TypeVar
基本格式(TypeVar代指类型):
flag.TypeVar(Type指针, flag名, 默认值, 帮助信息) //第一个输出参数为对应类型的指针
代码示例(定义3个参数 name age target):
var name string
var age int
var target string
flag.StringVar(&name, "name", "劲仔", "姓名")
flag.IntVar(&age, "age", 18, "年龄")
flag.StringVar(&target, "target", "保卫世界和平", "目标")
参数解析
通过调用flag.Parse()
来对命令行参数进行解析
支持4种命令行参数格式:
-flag xxx
(例如 -name 劲仔)--flag xxx
(例如 —name 劲仔)-flag=xxx
(例如 -name=劲仔)--flag=xxx
(例如 —name=劲仔)
注意点:
- 布尔类型的参数必须使用等号的方式指定
- flag解析在第一个非flag参数(单个”-“不是flag参数)之前停止,或者在终止符”–“之后停止
其他函数
flag包还提供了,以下几个函数,获取对应信息
flag.Args() //返回命令行参数后的其他参数,以[]string类型
flag.NArg() //返回命令行参数后的其他参数个数
flag.NFlag() //返回使用的命令行参数个数
使用案例
案例“立个flag”:动态的指定名字、年龄、目标,这3个参数,完成解析后,公开打印出来
func main() {
var name string
var age int
var target string
flag.StringVar(&name, "name", "劲仔", "姓名")
flag.IntVar(&age, "age", 18, "年龄")
flag.StringVar(&target, "target", "保卫世界和平", "目标")
flag.Parse()
fmt.Printf("%s %d岁,2023年有一个小目标是%s", name, age, target)
fmt.Println()
fmt.Println(flag.Args()) //返回命令行参数后的其他参数,以[]string类型
fmt.Println(flag.NArg()) //返回命令行参数后的其他参数个数
fmt.Println(flag.NFlag()) //返回使用的命令行参数个数
}
小技巧:
可以使用-help
,查看定义了哪些参数
└─[$] <> go run 07_package/08_flag.go -help
Usage of /var/folders/27/krz9rc512m5bvjtmbggysjxr0000gn/T/go-build1788465349/b001/exe/08_flag:
-age int
年龄 (default 18)
-name string
姓名 (default "劲仔")
-target string
目标 (default "保卫世界和平")
执行命令行:
建议使用等号的方式来指定参数,更简洁明了
└─[$] <> go run 07_package/08_flag.go -name=劲仔 -age=20 --target=挣一个亿
劲仔 20岁,2023年有一个小目标是挣一个亿
[]
0
3
注意:未定义的参数,被指定时,会报错。例如:
└─[$] <> go run 07_package/08_flag.go -name=劲仔 -age=20 --target=挣一个亿 -a=xx
flag provided but not defined: -a
备注:案例演示为了方便,命令行直接用的go run,正确使用应该是,先go build,然后基于可执行文件指定后面的参数。
总结
使用Go内置的flag包
,做命令行参数解析,简单易用,能很便捷的满足我们的业务使用。
记住这三步骤:参数定义、参数解析使用、指定对应参数执行命令行。
如果本文对你有帮助,欢迎点赞收藏加关注,如果本文有错误的地方,欢迎指出!
转载自:https://juejin.cn/post/7204423284904640570