全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-14 6 分钟 ✍️ juanwangdev

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函数表

函数参数类型返回值
Boolbool*bool
Intint*int
Int64int64*int64
Uintuint*uint
Uint64uint64*uint64
Float64float64*float64
Stringstring*string
BoolVarbool指针
IntVarint指针

解析参数

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支持子命令
  • 第三个参数是帮助说明
  • 默认值在注册时指定

📝 发现内容有误?点击此处直接编辑

← 上一篇 Go encoding/json包
下一篇 → Go fmt包
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库