Go语言中的 flag 包中,提供了命令行参数解析的功能。
有关命令行参数概念
- 命令行参数(或参数):是指运行程序时提供的参数;
- 已定义命令行参数:是指程序中通过 flag.Type 这种形式定义了的参数;
- 非 flag(non-flag)命令行参数(或保留的命令行参数):可以简单理解为 flag 包不能解析的参数。
flag包使用
flag.Type()
flag.Type(flag 名, 默认值, 帮助信息) *Type
示例代码
package main
import (
"flag"
"fmt"
)
func main() {
// 返回的name,age,married,delay等为对应类型的指针
name := flag.String("name", "张三", "姓名")
age := flag.Int("age", 18, "年龄")
married := flag.Bool("married", false, "婚否")
delay := flag.Duration("d", 0, "时间间隔")
// 设置好之后命令解析
flag.Parse()
// 返回的是指针,访问需使用*
fmt.Println(*name, *age, *married, *delay)
}
运行结果(可以看到没有赋值的地方采用我们之前的默认值)
go run main.go -name="syz" -age=20 -d=0
syz 20 false 0s
如果输入错误,会有提示信息usage
go run main.go -name="尚益州" -age=20 -d=1
invalid value "1" for flag -d: parse error
-age int
年龄 (default 18)
-d duration
时间间隔
-married
婚否
-name string
姓名 (default "张三")
exit status 2
可以看到提示哪个参数输入错误,也可以看到之前输入的参数的值和类型,输入的参数是否是默认参数。
支持的命令行参数格式有以下几种:
-flag
:只支持 bool 类型;-flag=x
:支持所有类型-flag x
:只支持非 bool 类型。
flag.TypeVar()
flag.TypeVar(Type 指针, flag 名, 默认值, 帮助信息)
实例代码
package main
import (
"flag"
"fmt"
)
func main() {
// 定义命令行参数
var name string
var age int
var married bool
// 使用 flag.TypeVar 方法
flag.StringVar(&name, "name", "张三", "名字信息")
flag.IntVar(&age, "age", 0, "年龄信息")
flag.BoolVar(&married, "married", false, "婚恋情况")
// 命令行参数解析
flag.Parse()
// 返回的是指针,访问需使用*
fmt.Println(name, age, married) // 李四 18 false
}
go run main.go -name="李四" -age=18 -married=false
李四 18 false
其他函数
flag.Args() //返回命令行参数后的其他参数,以[]string类型
flag.NArg() //返回命令行参数后的其他参数个数
flag.NFlag() //返回使用的命令行参数个数
实例代码
package main
import (
"flag"
"fmt"
)
func main() {
// 定义命令行参数
var name string
var age int
var married bool
// 使用 flag.TypeVar 方法
flag.StringVar(&name, "name", "张三", "名字信息")
flag.IntVar(&age, "age", 0, "年龄信息")
flag.BoolVar(&married, "married", false, "婚恋情况")
// 命令行参数解析
flag.Parse()
// 返回的是指针,访问需使用*
fmt.Println(name, age, married) // 李四 18 false
fmt.Println("the number of used args is ", flag.NFlag()) // 返回使用的命令行参数个数
fmt.Println("the number of other args ", flag.NArg()) // 返回命令行参数后的其他参数个数
fmt.Println("the number of other args ", flag.Args()) // 返回命令行参数后的其他参数,以[]string类型
}
go run main.go -name="李四" -age=18 -married=false hello world
李四 18 false
the number of used args is 3
the number of other args 2
the number of other args [hello world]
参考
Go语言flag包:命令行参数解析 (biancheng.net)