cobra 是 go cli 开发的必需工具,必须使用而非可选;它通过 cobra-cli 自动生成项目骨架、子命令及注册逻辑,统一管理 flag(需用 stringp/boolp 支持短长选项)、错误处理(推荐 rune 返回 error)和全局选项声明。

cobra 是当前 Go CLI 开发的事实标准,不是“可选”,而是必须用——尤其当你需要子命令(如 learn-go verb --help)或自动 help、补全、错误提示时。手动用 flag + os.Args 容易在参数分发、嵌套命令、退出码控制上翻车。
用 cobra-cli 初始化项目骨架
别从零写 main.go 和 cmd/root.go。直接用官方 CLI 工具生成结构:
-
cobra-cli init生成基础目录(cmd/、main.go),删掉cmd/root.go里注释和示例子命令 - 确保已安装:先
go install github.com/spf13/cobra-cli@latest,再go mod init mycli - 生成后运行
go run main.go就能看见默认 help 输出,说明骨架跑通了
添加子命令必须用 cobra-cli add
手动新建 cmd/verb.go 并调用 rootCmd.AddCommand() 容易漏注册或错配 init() 顺序。正确做法是:
-
cobra-cli add verb—— 自动生成文件、注册语句、占位Run函数 - 在生成的
Run函数里写逻辑,参数通过args []string拿位置参数,不要碰os.Args - 每个子命令文件只负责自己,不共享变量;全局选项(如
--verbose)统一在RootCmd.PersistentFlags()声明
参数定义要用 StringP 而不是 String
想支持短选项(-l)和长选项(--level)同时生效,必须用带 P 的变体:
-
cmd.Flags().StringP("level", "l", "basic", "difficulty level")—— 第二个参数是短名,第三个是默认值 - 如果只用
String("level", "basic", "..."),就只有--level,没有-l - 获取值统一用
cmd.Flags().GetString("level"),别用flag.String混用 - 布尔标志同理:
BoolP("force", "f", false, "skip confirmation")
RunE 返回 error 才算真正收口
写 Run 函数容易忽略错误传播路径。用 RunE 才能让 cobra 统一处理输出和退出码:
- 把
func(*cobra.Command, []string)改成func(*cobra.Command, []string) error - 校验失败时直接
return fmt.Errorf("missing arg: %s", name),不要log.Fatal或os.Exit(1) - 返回
nil表示成功;非 nil error 会自动打印到 stderr 并设退出码为 1 - 若需静默错误(比如自定义日志),显式设
cmd.SilenceErrors = true,但绝大多数情况不该关
RunE 必须独立处理自己的参数校验和业务错误,不能依赖外部状态;而全局 flag(如 --verbose)必须在 RootCmd 阶段声明,否则子命令里读不到。golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











