Go flag包
Go标准库flag实现命令行参数的解析和处理。
基本用法
注册参数
Go
import "flag"
// 定义命令行参数
var (
name = flag.String("name", "default", "用户名称")
age = flag.Int("age", 18, "用户年龄")
debug = flag.Bool("debug", false, "调试模式")
)
func main() {
// 解析参数
flag.Parse()
fmt.Println(*name) // 获取值
fmt.Println(*age) // 获取值
fmt.Println(*debug) // 获取值
}
使用方式
Bash
# 默认值运行
go run main.go
# 指定参数
go run main.go -name=Tom -age=25 -debug=true
# 简写形式
go run main.go -name Tom -age 25 -debug
参数绑定变量
flag.StringVar等
Go
var (
name string
age int
debug bool
)
func init() {
flag.StringVar(&name, "name", "default", "用户名称")
flag.IntVar(&age, "age", 18, "用户年龄")
flag.BoolVar(&debug, "debug", false, "调试模式")
}
func main() {
flag.Parse()
fmt.Println(name) // 直接使用变量
fmt.Println(age)
fmt.Println(debug)
}
flag.StringVar等函数直接绑定变量,无需解引用。
参数类型
支持的类型
Go
// 基本类型
flag.Bool("b", false, "布尔参数")
flag.Int("i", 0, "整数参数")
flag.Int64("i64", 0, "64位整数")
flag.Uint("u", 0, "无符号整数")
flag.Uint64("u64", 0, "无符号64位整数")
flag.Float64("f", 0.0, "浮点参数")
flag.String("s", "", "字符串参数")
// 对应Var版本
flag.BoolVar(&b, "b", false, "布尔参数")
flag.IntVar(&i, "i", 0, "整数参数")
// ...
flag函数表
| 函数 | 参数类型 | 返回值 |
|---|---|---|
| Bool | bool | *bool |
| Int | int | *int |
| Int64 | int64 | *int64 |
| Uint | uint | *uint |
| Uint64 | uint64 | *uint64 |
| Float64 | float64 | *float64 |
| String | string | *string |
| BoolVar | bool指针 | 无 |
| IntVar | int指针 | 无 |
解析参数
flag.Parse
Go
func main() {
flag.Parse() // 必须调用,解析命令行参数
// 解析后才能使用参数值
fmt.Println(*name)
}
flag.Args
Go
// 非flag参数
flag.Parse()
// 获取剩余参数
args := flag.Args()
fmt.Println(args) // ["arg1", "arg2"]
// 获取数量
n := flag.NArg() // 2
flag.Arg
Go
// 按索引获取非flag参数
flag.Parse()
arg0 := flag.Arg(0) // 第一个非flag参数
arg1 := flag.Arg(1) // 第二个
帮助信息
flag.PrintDefaults
Go
// 注册参数后调用
flag.PrintDefaults()
// 输出:
// -age int
// 用户年龄 (default 18)
// -debug
// 调试模式
// -name string
// 用户名称 (default "default")
自定义帮助
Go
flag.Usage = func() {
fmt.Println("自定义帮助信息")
flag.PrintDefaults()
}
// 查看帮助
// go run main.go -h
自定义参数类型
实现Value接口
Go
type Interval []string
func (i *Interval) String() string {
return strings.Join(*i, ",")
}
func (i *Interval) Set(value string) error {
*i = append(*i, value)
return nil
}
var interval Interval
flag.Var(&interval, "interval", "时间间隔")
// 使用:go run main.go -interval=hour -interval=day
子命令
flag.NewFlagSet
Go
// 创建子命令解析器
addCmd := flag.NewFlagSet("add", flag.ExitOnError)
addName := addCmd.String("name", "", "名称")
listCmd := flag.NewFlagSet("list", flag.ExitOnError)
listAll := listCmd.Bool("all", false, "全部列表")
func main() {
if len(os.Args) < 2 {
fmt.Println("期望子命令: add 或 list")
os.Exit(1)
}
switch os.Args[1] {
case "add":
addCmd.Parse(os.Args[2:])
fmt.Println(*addName)
case "list":
listCmd.Parse(os.Args[2:])
fmt.Println(*listAll)
}
}
Bash
# 使用子命令
go run main.go add -name=Tom
go run main.go list -all
参数验证
检查必需参数
Go
flag.Parse()
if *name == "" {
fmt.Println("-name 参数必需")
flag.Usage()
os.Exit(1)
}
if *age < 0 {
fmt.Println("-age 必须大于0")
os.Exit(1)
}
配置文件与参数结合
Go
// 配置文件设置默认值
config := loadConfig()
// 命令行参数覆盖
flag.StringVar(&config.Name, "name", config.Name, "名称")
flag.Parse()
// 最终配置
fmt.Println(config.Name)
要点总结
- flag.String/Int/Bool返回指针
- flag.StringVar/IntVar绑定变量
- flag.Parse必须调用解析参数
- flag.Args获取非flag参数
- flag.PrintDefaults打印帮助信息
- flag.Usage自定义帮助输出
- flag.Var支持自定义类型
- NewFlagSet支持子命令
- 第三个参数是帮助说明
- 默认值在注册时指定
📝 发现内容有误?点击此处直接编辑