Go语言的 flag
模块用于解析命令行参数,支持定义和解析各种类型的参数(如字符串、整数、布尔值等)。以下是 flag
模块的核心方法及示例说明:
1. 定义命令行参数
flag.String
、flag.Int
、flag.Bool
等
定义不同数据类型的命令行参数,并指定默认值和帮助说明。
package mainimport ("flag""fmt"
)func main() {// 定义参数:参数名、默认值、帮助说明name := flag.String("name", "Guest", "输入用户名")age := flag.Int("age", 20, "输入年龄")isAdmin := flag.Bool("admin", false, "是否为管理员")// 解析命令行参数flag.Parse()// 使用参数值(通过指针访问)fmt.Printf("用户: %s, 年龄: %d, 管理员: %t\n", *name, *age, *isAdmin)
}
运行命令:
go run main.go -name Alice -age 25 -admin
# 输出: 用户: Alice, 年龄: 25, 管理员: true
2. 绑定参数到变量
flag.StringVar
、flag.IntVar
、flag.BoolVar
等
将参数直接绑定到变量,无需通过指针访问。
func main() {var name stringvar age intvar isAdmin bool// 绑定参数到变量flag.StringVar(&name, "name", "Guest", "输入用户名")flag.IntVar(&age, "age", 20, "输入年龄")flag.BoolVar(&isAdmin, "admin", false, "是否为管理员")flag.Parse()fmt.Printf("用户: %s, 年龄: %d, 管理员: %t\n", name, age, isAdmin)
}
3. 解析参数
flag.Parse
解析命令行参数,必须在访问参数值前调用。
flag.Parse() // 解析所有定义的参数
4. 获取非选项参数
flag.Args
和 flag.Arg
获取命令行中未被 flag
解析的非选项参数(即不带 -
或 --
的参数)。
func main() {flag.Parse()// 获取所有非选项参数(切片)args := flag.Args()fmt.Println("非选项参数:", args)// 获取第 i 个非选项参数(从 0 开始)if flag.NArg() > 0 {fmt.Println("第一个非选项参数:", flag.Arg(0))}
}
运行命令:
go run main.go arg1 arg2 -name Alice
# 输出: 非选项参数: [arg1 arg2]
5. 参数数量检查
flag.NArg
和 flag.NFlag
NArg
:非选项参数的数量。NFlag
:已设置的选项参数的数量。
func main() {flag.Parse()fmt.Printf("已设置 %d 个选项参数,剩余 %d 个非选项参数\n", flag.NFlag(), flag.NArg())
}
6. 自定义帮助信息
flag.Usage
覆盖默认的帮助信息输出。
func main() {flag.Usage = func() {fmt.Fprintf(flag.CommandLine.Output(), "用法示例:\n")flag.PrintDefaults() // 显示默认帮助信息}name := flag.String("name", "", "输入用户名")flag.Parse()if *name == "" {flag.Usage() // 用户未输入时显示帮助return}
}
运行命令:
go run main.go -h
# 输出自定义帮助信息
7. 遍历参数
flag.Visit
和 flag.VisitAll
遍历已设置的参数或所有定义的参数。
func main() {name := flag.String("name", "Guest", "用户名")age := flag.Int("age", 0, "年龄")flag.Parse()// 遍历已设置的参数fmt.Println("已设置的参数:")flag.Visit(func(f *flag.Flag) {fmt.Printf("%s: %v\n", f.Name, f.Value)})// 遍历所有定义的参数fmt.Println("\n所有定义的参数:")flag.VisitAll(func(f *flag.Flag) {fmt.Printf("%s: %v\n", f.Name, f.Value)})
}
8. 高级操作
flag.Lookup
和 flag.Set
Lookup
:根据参数名查找Flag
对象。Set
:手动设置参数的值。
func main() {name := flag.String("name", "Guest", "用户名")flag.Parse()// 查找参数f := flag.Lookup("name")fmt.Println("参数名:", f.Name)// 手动设置参数值(需在 Parse 前调用)flag.Set("name", "Bob")fmt.Println("修改后的 name:", *name)
}
9. 解析短选项
允许短选项格式(如 -n
和 --name
等效)。
func main() {name := flag.String("n", "Guest", "用户名(短选项)")flag.Parse()fmt.Println("Name:", *name)
}
运行命令:
go run main.go -n Alice
# 或
go run main.go --n Alice
总结
- 核心方法:
- 定义参数:
String
,Int
,Bool
,StringVar
,IntVar
等。 - 解析参数:
Parse
。 - 获取参数:
Args
,Arg
,NArg
,NFlag
。 - 高级操作:
Visit
,Lookup
,Set
,Usage
。
- 定义参数:
- 常用场景:
- 解析命令行选项(如
-port=8080
)。 - 处理非选项参数(如文件名列表)。
- 生成帮助信息。
- 解析命令行选项(如
- 注意事项:
- 必须在
Parse()
后访问参数值。 - 默认支持长选项(
--name
)和短选项(-n
)。 - 使用
flag.Usage
可自定义帮助信息格式。
- 必须在