Go flag 包使用指南

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(): 显示帮助信息

参考资源

57.12k 字
43篇文章