在编写命令行程序时,通常需要解析命令行参数。Go 语言的 flag
包为我们提供了一种非常便捷的方式来定义和解析命令行参数。
flag 包的基本用法
import (
"flag"
"fmt"
)
func main() {
// 定义命令行参数
name := flag.String("name", "world", "输入你的名字")
age := flag.Int("age", 25, "输入你的年龄")
// 解析命令行参数
flag.Parse()
// 输出结果
fmt.Printf("Hello, %s! 你今年 %d 岁。\n", *name, *age)
}
在上面的代码中,我们使用 flag.String
和 flag.Int
函数定义了两个命令行参数 name
和 age
。这两个函数的第一个参数是参数名称,第二个参数是默认值,第三个参数是参数描述。
调用 flag.Parse()
后,命令行参数就会被解析并赋值给相应的变量。name
和 age
是指向 flag
包内部存储的值的指针,我们需要使用 *
操作符获取它们的实际值。
如果我们运行这个程序而不传入任何命令行参数,将会得到默认输出:
Hello, world! 你今年 25 岁。
我们也可以在命令行中传入自定义的参数值:
$ go run main.go -name=Alice -age=30
Hello, Alice! 你今年 30 岁。
flag 包支持的参数类型
flag
包支持以下几种参数类型:
String
- 字符串参数Int
- 整数参数Bool
- 布尔参数Float64
- 浮点数参数Duration
- 时间段参数(例如24h
、1.5h
等)
除了上面这些基本类型外,我们还可以使用 Var
函数定义其他类型的参数,只需要实现 Value
接口即可。
定义参数的其他方式
除了上面展示的方式,我们还可以使用以下几种定义参数的方式:
单字符参数
// 定义单字符参数
maxProcs := flag.Int("n", 1, "设置最大 CPU 核数")
上面的代码定义了一个单字符参数 -n
,传参时可以使用 -n=4
或者 -n 4
。
参数可变长度切片
// 定义可变长度的切片参数
repos := flag.String("repo", "", "Git 仓库地址列表(可多次传入)")
上面的代码定义了一个字符串参数 -repo
,可以多次传入,如 -repo=a -repo=b
。在程序中,repos
就是一个字符串切片。
参数默认值不同格式
// 定义不同格式的默认值
flag.Float64("ratio", 0.7, "失败率(0 ~ 1)")
flag.Bool("debug", true, "是否开启调试模式")
flag.Int64("delay", 1000, "延迟时间(单位: ns)")
上面分别定义了浮点数、布尔值和整数作为默认值。
多行参数说明
// 多行参数说明
flag.String("certs", "", `加密证书列表:
- certs/ca.crt
- certs/client.crt
`)
使用反引号 `` 可以编写多行参数说明。
高级用法
flag
包还有一些高级用法,比如定义参数别名、嵌套参数等。大家有兴趣可以参考官方文档:https://golang.org/pkg/flag/