Go中设置flag默认值需在flag.Xxx或flag.XxxVar调用时传入,默认值自动写入变量;必须在flag.Parse()后使用变量;支持内置-help、flag.Func动态默认等机制。
在 Go 中使用 flag 包设置命令行参数默认值非常直接,关键在于调用对应类型的 flag.XxxVar 或 flag.Xxx 函数时,把默认值作为参数传入——Go 会自动将该值写入变量,并在用户未提供参数时保留它。
这是最常用也最清晰的方式。每个 flag 函数(如 flag.String)返回一个指针,同时内部已把默认值赋给底层变量:
port := flag.Int("port", 8080, "HTTP server port") —— 若命令行没传 -port,*port 就是 8080
name := flag.String("name", "guest", "user name") —— 未指定 -name 时,*name 为 "guest"
debug := flag.Bool("debug", false, "enable debug mode") —— -debug 是开关型参数,默认关闭;加了就变为 true
适合你想复用已有变量名,或需在 flag 解析前就初始化好变量的情况:
var timeout int = 30
flag.IntVar(&timeout, "timeout", timeout, "request timeout in seconds")
timeout 初始值,flag.IntVar 第三个参数仍决定命令行默认行为Go 的 flag 包是延迟解析的,所有
flag.Xxx 调用只是注册参数,真正读取和赋值发生在 flag.Parse() 执行时:
flag.Parse() → 使用 *port、*name 等flag.Parse() 前就打印 *port,此时还是零值(如 0 或 "")./app -h 或 --help,无需额外写逻辑,flag.Parse() 内置支持,遇到就自动打印 Usage 并退出当默认值需运行时计算(比如读配置文件、查环境变量),可用 flag.Func 配合闭包:
configFile := flag.String("config", "", "config file path")flag.Func 注册一个伪 flag,解析时检查 *configFile 是否为空,为空则设为 os.Getenv("CONFIG_PATH") 或 "config.yaml"
-h 列出说明