wx

关注公众号

flag


Golang 标准库 - flag

flag 包实现了命令行参数的解析。需要声明的参数通过 flag.String()flag.Int() 等函数定义。

主要功能说明:

  1. 定义参数

    • String() 字符串参数
    • Int() 整数参数
    • Bool() 布尔参数
    • Duration() 时间间隔参数
  2. 解析参数

    • Parse() 解析命令行参数
    • Args() 获取非标志参数
    • NArg() 获取非标志参数数量
  3. 自定义 FlagSet

    • NewFlagSet() 创建独立的标志集合
    • 用于子命令实现
  4. 帮助信息

    • 自动生成帮助信息
    • -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])
	}
}
如有疑问关注公众号给我留言
wx

关注公众号

©2017-2023 鲁ICP备17023316号-1 Powered by Hugo