flag 包简介
flag
包是 Go 标准库中用于解析命令行参数的包。它提供了简单而强大的命令行参数处理功能。
基本用法
定义参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| package main
import (
"flag"
"fmt"
)
// 定义命令行参数
var (
name = flag.String("name", "default", "用户名称")
age = flag.Int("age", 0, "用户年龄")
verbose = flag.Bool("v", false, "是否显示详细信息")
)
func main() {
// 解析命令行参数
flag.Parse()
// 使用参数
fmt.Printf("Name: %s\n", *name)
fmt.Printf("Age: %d\n", *age)
fmt.Printf("Verbose: %v\n", *verbose)
}
|
运行示例
1
2
3
4
5
6
7
8
| # 使用默认值
go run main.go
# 指定参数
go run main.go -name "John" -age 25 -v
# 查看帮助信息
go run main.go -help
|
高级用法
自定义参数类型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| package main
import (
"flag"
"fmt"
"time"
)
// 自定义时间类型
type timeValue time.Time
func (t *timeValue) String() string {
return time.Time(*t).Format(time.RFC3339)
}
func (t *timeValue) Set(value string) error {
parsed, err := time.Parse(time.RFC3339, value)
if err != nil {
return err
}
*t = timeValue(parsed)
return nil
}
func main() {
var t timeValue
flag.Var(&t, "time", "设置时间 (RFC3339格式)")
flag.Parse()
fmt.Printf("Time: %v\n", time.Time(t))
}
|
子命令支持
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
| package main
import (
"flag"
"fmt"
"os"
)
func main() {
// 创建子命令
addCmd := flag.NewFlagSet("add", flag.ExitOnError)
listCmd := flag.NewFlagSet("list", flag.ExitOnError)
// 定义子命令参数
addName := addCmd.String("name", "", "添加项目名称")
listAll := listCmd.Bool("all", false, "列出所有项目")
// 检查子命令
if len(os.Args) < 2 {
fmt.Println("需要指定子命令: add 或 list")
os.Exit(1)
}
switch os.Args[1] {
case "add":
addCmd.Parse(os.Args[2:])
fmt.Printf("添加项目: %s\n", *addName)
case "list":
listCmd.Parse(os.Args[2:])
fmt.Printf("列出所有项目: %v\n", *listAll)
default:
fmt.Println("未知的子命令")
os.Exit(1)
}
}
|
常用函数
flag.String()
: 定义字符串参数flag.Int()
: 定义整数参数flag.Bool()
: 定义布尔参数flag.Float64()
: 定义浮点数参数flag.Duration()
: 定义时间间隔参数flag.Var()
: 定义自定义类型参数flag.Parse()
: 解析命令行参数flag.Usage()
: 显示帮助信息
参考资源