使用 Go 编写 CLI(命令行界面)工具是 Go 的常见应用之一,得益于其编译后单文件、跨平台的特点。下面我将分步骤介绍如何用 Go 编写一个 CLI 工具,包括示例代码、项目结构以及常用库。
🧱 一、准备工作
- 安装 Go:https://golang.org/dl/
- 创建项目目录:
mkdir mycli
cd mycli
go mod init github.com/yourusername/mycli
🛠️ 二、快速示例:一个简单的 CLI 工具
下面是一个基本的 CLI 工具,它支持两个子命令:hello
和 goodbye
,可以接受参数。
✅ 推荐用法:使用 cobra
库(最常见的 CLI 框架)
go get -u github.com/spf13/cobra@latest
项目结构(建议):
mycli/
├── cmd/
│ ├── root.go
│ ├── hello.go
│ └── goodbye.go
├── go.mod
└── main.go
🧩 三、代码部分
1. main.go
package main
import "github.com/yourusername/mycli/cmd"
func main() {
cmd.Execute()
}
2. cmd/root.go
package cmd
import (
"fmt"
"os"
"github.com/spf13/cobra"
)
var rootCmd = &cobra.Command{
Use: "mycli",
Short: "MyCLI 是一个演示用的 CLI 工具",
}
func Execute() {
if err := rootCmd.Execute(); err != nil {
fmt.Println(err)
os.Exit(1)
}
}
3. cmd/hello.go
package cmd
import (
"fmt"
"github.com/spf13/cobra"
)
var helloCmd = &cobra.Command{
Use: "hello",
Short: "输出问候语",
Run: func(cmd *cobra.Command, args []string) {
name, _ := cmd.Flags().GetString("name")
if name == "" {
name = "世界"
}
fmt.Printf("你好,%s!\n", name)
},
}
func init() {
rootCmd.AddCommand(helloCmd)
helloCmd.Flags().StringP("name", "n", "", "指定名字")
}
4. cmd/goodbye.go
package cmd
import (
"fmt"
"github.com/spf13/cobra"
)
var goodbyeCmd = &cobra.Command{
Use: "goodbye",
Short: "说再见",
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("再见!")
},
}
func init() {
rootCmd.AddCommand(goodbyeCmd)
}
🚀 四、运行效果
编译并运行:
go build -o mycli
./mycli hello --name 张三
# 输出:你好,张三!
./mycli goodbye
# 输出:再见!
🧰 五、其它建议的 CLI 库
库 | 特点 |
---|---|
cobra | 功能全面,支持子命令、自动帮助等(推荐) |
urfave/cli | 更简洁,适合结构简单的 CLI |
pflag | flag 的增强版本,兼容 GNU 风格参数 |
📦 六、打包与发布
# Linux/macOS
GOOS=linux GOARCH=amd64 go build -o mycli
# Windows
GOOS=windows GOARCH=amd64 go build -o mycli.exe
你也可以用 goreleaser 自动打包发布 GitHub Release。