likes
comments
collection
share

Go命令行参数解析|“立个flag”

作者站长头像
站长
· 阅读数 64

前言

业务脚本经常需要动态指定一些参数,来满足业务场景使用。Go语言内置了flag包实现了命令行参数的解析,简单易用。本文先快速过一遍flag包的使用,然后结合案例“立个flag”加深理解与使用

参数定义

支持的参数类型

包括:boolintint64uintuint64float32 float64stringduration

做个分类:

  • 布尔类型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", "保卫世界和平", "目标")

需要注意:此时nameagetarget均为对应类型的指针

方式 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
评论
请登录