flag
Golang 标准库 - flag
flag 包实现了命令行参数的解析。需要声明的参数通过
flag.String()、flag.Int() 等函数定义。
主要功能说明:
-
定义参数:
String()字符串参数Int()整数参数Bool()布尔参数Duration()时间间隔参数
-
解析参数:
Parse()解析命令行参数Args()获取非标志参数NArg()获取非标志参数数量
-
自定义 FlagSet:
NewFlagSet()创建独立的标志集合- 用于子命令实现
-
帮助信息:
- 自动生成帮助信息
-h或--help显示帮助
func main() {
// 1. 定义命令行参数
// 格式: flag.类型(名称, 默认值, 帮助信息)
name := flag.String("name", "World", "a name to say hello to")
age := flag.Int("age", 0, "your age")
verbose := flag.Bool("v", false, "verbose output")
// 使用 flag.Duration 解析时间间隔
timeout := flag.Duration("timeout", 5*time.Second, "connection timeout")
// 2. 解析命令行参数
flag.Parse()
// 3. 使用参数
fmt.Printf("Hello, %s!\n", *name)
fmt.Printf("Age: %d\n", *age)
fmt.Printf("Timeout: %v\n", *timeout)
if *verbose {
fmt.Println("Verbose mode enabled")
}
// 4. 获取非标志参数
fmt.Printf("Non-flag arguments: %v\n", flag.Args())
fmt.Printf("Number of non-flag arguments: %d\n", flag.NArg())
}
// 运行示例:
// go run main.go -name=Alice -age=30 -v -timeout=10s arg1 arg2
// 高级示例:自定义 FlagSet 实现子命令
type SubCommand struct {
fs *flag.FlagSet
name string
}
func NewSubCommand(name string) *SubCommand {
return &SubCommand{
fs: flag.NewFlagSet(name, flag.ContinueOnError),
name: name,
}
}
func (s *SubCommand) Parse(args []string) error {
return s.fs.Parse(args)
}
func (s *SubCommand) Name() string {
return s.name
}
// 使用示例
func SubCommandDemo() {
if len(os.Args) < 2 {
fmt.Println("Usage: program <command> [options]")
fmt.Println("Commands: serve, version")
os.Exit(1)
}
switch os.Args[1] {
case "serve":
port := flag.String("port", "8080", "server port")
flag.CommandLine.Parse(os.Args[2:])
fmt.Printf("Starting server on port %s\n", *port)
case "version":
fmt.Println("Version 1.0.0")
default:
fmt.Printf("Unknown command: %s\n", os.Args[1])
}
}