Skip to content

flag ​

阅读提示

  • 适用版本:Go 1.21+(示例在 Go 1.22 下验证)· 前置知识:语法基础-基本语法 · 阅读时长:约 10 分钟

Go语言内置的Flag包实现了命令行参数的解析,Flag包使得开发命令行工具更加简单。

导入 ​

go
import flag

类型 ​

其支持的类型有:

  • bool
  • int
  • int64
  • uint
  • uint64
  • float
  • float64
  • string
  • duration

定义 ​

使用flag.Type()来定义,返回值是指针

go
name := flag.String("name", "张三", "姓名")
age := flag.Int("age", 15, "年龄")
sex := flag.Bool("sex", true, "性别")

也可以使用flag.TypeVar()来定义

go
var name string
var age int
var sex bool
flag.StringVar(&name, "name", "张三", "姓名")
flag.IntVar(&age, "age", 15, "年龄")
flag.BoolVar(&sex, "sex", true, "性别")

解析 ​

通过调用flag.Parse()来解析参数,支持的命令行参数格式有如下几种:

  • -flag xxx
  • --flag xxx
  • -flag=xxx
  • --flag=xxx

布尔类型的参数必须使用等号,Flag解析会在第一个非命令行参数之前停止。

其他 ​

go
func Args() []string //返回所有非命令参数

func NArg() int //返回非命令行参数的个数

func NFlag() int //返回命令行参数的个数

示例 ​

go
var name string
var age int
var sex bool
flag.StringVar(&name, "name", "张三", "姓名")
flag.IntVar(&age, "age", 15, "年龄")
flag.BoolVar(&sex, "sex", true, "性别")

flag.Parse()
fmt.Println(name, age, sex)

编译后在命令行启动程序

powershell
PS D:\WorkSpace\Code\GoProject\bin> .\go_build_GoProject_src_main.exe
张三 15 true
PS D:\WorkSpace\Code\GoProject\bin> .\go_build_GoProject_src_main.exe -h
Usage of D:\WorkSpace\Code\GoProject\bin\go_build_GoProject_src_main.exe:
  -age int
        年龄 (default 15)
  -name string
        姓名 (default "张三")
  -sex
        性别 (default true)
PS D:\WorkSpace\Code\GoProject\bin> .\go_build_GoProject_src_main.exe -age 15 -name "李四" -sex=false
李四 15 false
PS D:\WorkSpace\Code\GoProject\bin>

完整示例 ​

下面的程序可以直接运行:复制到文件后执行 go run main.go,或粘贴到 Go Playground 运行。

go
package main

import (
	"flag"
	"fmt"
	"strings"
)

func main() {
	fs := flag.NewFlagSet("demo", flag.ContinueOnError)
	name := fs.String("name", "world", "who to greet")
	verbose := fs.Bool("v", false, "verbose output")

	_ = fs.Parse([]string{"-name", "gopher", "-v"})

	fmt.Println("hello,", *name)
	if *verbose {
		fmt.Println("flags:", strings.Join([]string{"-name", "-v"}, " "))
	}
}

预期输出:

text
hello, gopher
flags: -name -v

常见错误与踩坑 ​

  • 先定义 flag 再 Parse。 先调用 flag.Parse() 会导致自定义参数仍处于未知状态。
  • 布尔型参数要用等号。 写成 -sex=false;-sex false 会把 false 当位置参数。
  • 测试中优先用 FlagSet。 flag.NewFlagSet 可以避免包级全局状态互相干扰。
  • 位置参数在解析之后取。 从 fs.Args() 读取。
  • flag 不是环境变量。 环境配置要显式读取(例如 os.Getenv)。

更新记录 ​

  • 2026-10-14:新增"阅读提示"、完整可运行示例(含预期输出)、常见错误与踩坑清单,以及本更新记录。