在 Go 语言中,flag
是一个用于解析命令行参数的标准库。通过这个库,你可以很方便地从命令行中获取用户传入的参数,比如字符串、整数、布尔值等。
主要用途:
处理命令行参数,例如:
go run main.go -name=Tom -age=25 -debug=true
基本使用示例:
package main
import (
"flag"
"fmt"
)
func main() {
// 定义命令行参数
name := flag.String("name", "default", "请输入用户名")
age := flag.Int("age", 18, "请输入年龄")
debug := flag.Bool("debug", false, "是否开启调试模式")
// 解析命令行参数
flag.Parse()
fmt.Println("name:", *name)
fmt.Println("age:", *age)
fmt.Println("debug:", *debug)
}
常用函数:
函数 | 用途 |
---|---|
flag.String(name, default, usage) | 定义字符串参数 |
flag.Int(name, default, usage) | 定义整数参数 |
flag.Bool(name, default, usage) | 定义布尔参数 |
flag.Parse() | 开始解析命令行参数 |
flag.Args() | 获取非 flag 的参数 |
flag.NArg() | 获取非 flag 参数个数 |
需要注意,flag
默认只支持 -key=value
或 -key value
的形式,不支持 --key
的双横线写法(这在某些 CLI 工具中是常见的)。
使用上面的写法获取到的变量是一个指针,所以在访问的时候如果要访问对应的值需要在变量之前加一个*号
如果想要直接得到变量也可以是用下面这种写法
var name string
flag.StringVar(&name, "name", "default", "请输入用户名")
这种写法是自己定义一个变量,然后将它的地址传进去
flag
后面的提示文字(也叫 usage 或说明文本)会在以下几种情况下自动显示:
1. 用户执行程序时传入了 h
或 -help
这是最常见的触发方式,flag
包会自动帮你注册 -h
和 --help
参数,触发时会显示所有参数的说明信息。例如:
go run main.go -h
输出会像这样:
Usage of /tmp/go-build.../main:
-age int
请输入年龄 (default 18)
-debug
是否开启调试模式 (default false)
-name string
请输入用户名 (default "default")
2. 程序中手动调用 flag.Usage()
你可以在代码里手动触发帮助信息显示,例如参数验证失败时:
if *name == "" {
fmt.Println("name 参数不能为空")
flag.Usage()
os.Exit(1)
}
3. 覆盖默认的帮助输出内容(可选)
你也可以自定义 flag.Usage
的行为,比如美化输出:
flag.Usage = func() {
fmt.Println("用法说明:")
fmt.Println(" -name string 请输入用户名 (默认值:default)")
fmt.Println(" -age int 请输入年龄 (默认值:18)")
fmt.Println(" -debug 是否开启调试模式 (默认值:false)")
}
总结一下:
方式 | 是否自动显示帮助信息 |
---|---|
运行时使用 -h 或 --help | ✅ 自动显示 |
手动调用 flag.Usage() | ✅ 手动触发 |
用户没有传必要参数 | ❌ 不会自动显示(需要你手动判断并触发) |