写 Go 小工具时,如果只是接一两个开关,不一定马上上 cobra 这类框架。标准库的 flag 对轻量命令还挺够用。
环境:Go 1.20+。保存成 flag-demo.go:
package main
import (
"flag"
"fmt"
)
func main() {
name := flag.String("name", "mesh", "要打印的名字")
count := flag.Int("count", 1, "打印次数")
dryRun := flag.Bool("dry-run", false, "只展示参数")
flag.Parse()
fmt.Printf("name=%s count=%d dryRun=%v args=%v\n", *name, *count, *dryRun, flag.Args())
if *dryRun {
return
}
for i := 0; i < *count; i++ {
fmt.Println(*name)
}
}
跑一下:
go run flag-demo.go -name dev -count 2 extra.txt
flag.Args() 会留下没有被解析成选项的普通参数。等命令开始有子命令、配置文件、复杂帮助信息时,再换更完整的 CLI 框架也不晚。