本教程面向零基础开发者,手把手教你用 Claude Code 开发一个实用的 Go CLI 工具。你将学会 Claude Code 的安装配置、项目初始化、对话式开发、测试调试、Git 工作流和发布全流程。通过构建一个真实可用的 Markdown 文件搜索工具 mdfinder,在实战中掌握 AI 辅助编程的核心技能。
适合人群:Go 语言初学者、想快速上手 Claude Code 的开发者、对 AI 辅助编程感兴趣的工程师
学习目标:
- 完成 Claude Code 环境搭建与认证
- 掌握 CLAUDE.md 项目配置技巧
- 用对话式开发构建完整的 Go CLI 应用
- 理解 Plan Mode、权限管理、上下文压缩等核心功能
- 实现 Git 工作流自动化与项目发布
| 工具 | 最低版本 | 安装方式 |
|---|---|---|
| Node.js | ≥ 18.0 | brew install node 或 nodejs.org |
| Go | ≥ 1.21 | brew install go 或 go.dev/dl |
| Git | ≥ 2.30 | brew install git |
| 终端 | 任意 | macOS Terminal / Linux bash / Windows WSL |
无需基础:Go 语法会在开发过程中由 Claude Code 解释,你不需要提前学 Go。
打开终端,执行安装命令:
# 通过 npm 全局安装
npm install -g @anthropic-ai/claude-code
# 验证安装
claude --version
预期输出:
Claude Code v1.0.x
Windows 用户注意:Claude Code 需要 WSL2 环境。在 PowerShell 中执行
wsl --install,然后在 WSL 终端内操作。
claude
首次运行会进入交互式认证流程:
╭──────────────────────────────────────────╮
│ Welcome to Claude Code! │
│ │
│ Choose an authentication method: │
│ 1. Anthropic API Key │
│ 2. Claude App Subscription (Pro/Team) │
│ 3. Enterprise SSO │
╰──────────────────────────────────────────╯
推荐选择:
- 如果你有 Claude Pro/Team 订阅 → 选 2,会打开浏览器完成 OAuth 登录
- 如果你有 API Key → 选 1,粘贴 sk-ant-xxx 格式的密钥
- 企业用户 → 选 3,使用公司 SSO
认证成功后,你会看到 Claude Code 的交互提示符:
>
| 问题 | 原因 | 解决方案 |
|---|---|---|
command not found: claude |
npm 全局路径未加入 PATH | 执行 npm config get prefix,将 /bin 加入 PATH |
EACCES permission denied |
npm 全局目录权限不足 | 使用 nvm 管理 Node.js,或 sudo npm install -g |
| Node.js 版本过低 | 需要 ≥ 18.0 | node -v 检查,升级 Node.js |
| WSL 中网络错误 | DNS 配置问题 | 在 /etc/resolv.conf 添加 nameserver 8.8.8.8 |
# 创建项目目录
mkdir mdfinder && cd mdfinder
# 初始化 Go module
go mod init github.com/yourname/mdfinder
# 创建基本目录结构
mkdir -p cmd internal
CLAUDE.md 是 Claude Code 的"项目说明书",它告诉 Claude 你的项目结构、编码规范和开发约定。
在项目根目录创建 CLAUDE.md:
# mdfinder - Markdown 文件搜索工具
## 项目概述
一个用 Go 编写的 CLI 工具,用于递归搜索目录中的 Markdown 文件,
支持按标题、标签、内容关键词搜索,输出彩色高亮结果。
## 技术栈
- Go 1.21+
- 使用标准库为主,仅允许以下外部依赖:
- cobra:CLI 框架
- fatih/color:终端彩色输出
## 项目结构
- `cmd/` — 命令入口
- `internal/searcher` — 搜索引擎核心逻辑
- `internal/parser` — Markdown 解析器
- `internal/formatter` — 输出格式化
## 编码规范
- 所有公共函数必须有 GoDoc 注释
- 错误处理使用 `fmt.Errorf` 包装,不使用第三方 errors 库
- 测试文件与源文件同目录,命名为 `*_test.go`
- 变量命名使用驼峰,常量使用驼峰或全大写
## 常用命令
- `go build -o bin/mdfinder ./cmd/mdfinder` — 构建
- `go test ./...` — 运行全部测试
- `go run ./cmd/mdfinder search ./docs --keyword "API"` — 运行
为什么要写 CLAUDE.md? Claude Code 在每次对话开始时自动读取这个文件。它相当于给 AI 一个永久的"项目上下文",避免重复解释项目结构。根据 Anthropic 官方博客的建议,CLAUDE.md 是提高 Claude Code 输出质量的单一最高影响因素。
claude
Claude Code 启动后会自动扫描项目目录:
╭──────────────────────────────────────────╮
│ Claude Code • claude-sonnet-4-6 │
│ Project: mdfinder │
│ Context: 3 files indexed │
╰──────────────────────────────────────────╯
>
此时 Claude Code 已经读取了你的 CLAUDE.md、go.mod 和目录结构,准备好协助开发了。
在 Claude Code 提示符下,按 Shift+Tab 或输入 /plan 进入 Plan Mode。Plan Mode 让 Claude 只分析和规划,不修改文件——这是设计阶段的最佳实践。
> /plan
然后输入需求:
设计 mdfinder 的 CLI 命令结构。需要支持三个子命令:
1. search — 搜索 Markdown 文件(支持 --keyword, --tag, --title 参数)
2. index — 建立搜索索引(加速后续搜索)
3. version — 显示版本信息
请给出命令架构设计和文件结构建议。
Claude 的规划输出示例:
## 架构设计
mdfinder/
├── cmd/
│ └── mdfinder/
│ └── main.go # 入口,初始化 cobra rootCmd
├── internal/
│ ├── searcher/
│ │ ├── searcher.go # 搜索引擎接口与实现
│ │ └── searcher_test.go
│ ├── parser/
│ │ ├── markdown.go # Markdown 解析(提取标题、标签)
│ │ └── markdown_test.go
│ ├── formatter/
│ │ ├── color.go # 彩色输出
│ │ └── color_test.go
│ └── index/
│ ├── indexer.go # 索引构建与持久化
│ └── indexer_test.go
├── go.mod
├── go.sum
├── CLAUDE.md
└── README.md
命令注册流程:
rootCmd → searchCmd / indexCmd / versionCmd
按 Shift+Tab 或输入 /plan 退出 Plan Mode,回到正常编码模式。
> 按照 Plan 中的架构,创建所有文件的骨架代码。
> 使用 cobra 库,先实现 version 子命令。
> 先不要实现 search 和 index 的完整逻辑,只留 TODO 注释。
Claude Code 会:
1. 执行 go get github.com/spf13/cobra 安装依赖
2. 创建 cmd/mdfinder/main.go,注册 rootCmd 和三个子命令
3. 在各文件中写入骨架代码
预期输出(cmd/mdfinder/main.go):
package main
import (
"fmt"
"os"
"github.com/spf13/cobra"
)
var rootCmd = &cobra.Command{
Use: "mdfinder",
Short: "A Markdown file search tool",
Long: "mdfinder recursively searches directories for Markdown files, supporting keyword, tag, and title search.",
}
var versionCmd = &cobra.Command{
Use: "version",
Short: "Print the version number",
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("mdfinder v0.1.0")
},
}
func init() {
rootCmd.AddCommand(versionCmd)
}
func main() {
if err := rootCmd.Execute(); err != nil {
os.Exit(1)
}
}
验证骨架代码:
> 帮我运行 go build 和 version 子命令,确认能正常工作。
Claude Code 会执行构建和运行命令:
go build -o bin/mdfinder ./cmd/mdfinder
./bin/mdfinder version
# 输出: mdfinder v0.1.0
> 实现 internal/parser/markdown.go,需要:
> 1. 解析 Markdown 文件,提取一级标题
> 2. 提取 YAML front matter 中的 tags 字段
> 3. 返回结构化数据 Document{Path, Title, Tags, Content}
> 同时写好测试文件 markdown_test.go
Claude Code 会生成完整的解析器实现和测试。关键交互技巧:
> 实现 internal/searcher/searcher.go:
> 1. 接收搜索参数(keyword, tag, title)
> 2. 递归遍历目录查找 .md 文件
> 3. 用 parser 解析后按条件过滤
> 4. 返回匹配的 Document 切片
> 要支持大小写不敏感搜索。
预期核心逻辑:
type SearchParams struct {
Keyword string
Tag string
Title string
Path string
}
type Document struct {
Path string
Title string
Tags []string
Content string
}
func Search(params SearchParams) ([]Document, error) {
var results []Document
err := filepath.WalkDir(params.Path, func(path string, d fs.DirEntry, err error) error {
if err != nil || !strings.HasSuffix(path, ".md") {
return nil
}
doc, parseErr := parser.ParseFile(path)
if parseErr != nil {
return nil
}
if matches(doc, params) {
results = append(results, doc)
}
return nil
})
return results, err
}
> 在 cmd/mdfinder/main.go 中实现 search 子命令的完整逻辑:
> 1. 接收 --keyword, --tag, --title, --dir 参数
> 2. 调用 searcher.Search
> 3. 用 formatter 彩色输出结果
> 4. 没有匹配时输出友好提示
构建并测试:
# 先创建一些测试 Markdown 文件
mkdir -p testdata
cat > testdata/golang.md << 'EOF'
---
tags: [go, programming, backend]
---
# Go 语言入门
Go 是一门静态类型、编译型的编程语言,适合构建高并发服务。
EOF
cat > testdata/react.md << 'EOF'
---
tags: [react, frontend, javascript]
---
# React 快速上手
React 是一个用于构建用户界面的 JavaScript 库。
EOF
# 搜索测试
./bin/mdfinder search ./testdata --keyword "编程"
./bin/mdfinder search ./testdata --tag "frontend"
预期输出:
Found 1 result:
📄 golang.md
Title: Go 语言入门
Tags: go, programming, backend
Match: "...适合构建高并发服务。"
> 运行所有测试,确保通过。如果有失败,修复后重新运行。
Claude Code 会执行 go test ./... -v 并处理失败的测试。
当遇到 bug 时,描述现象而非猜测原因:
> 运行 ./bin/mdfinder search ./testdata --tag "go" 没有返回结果,
> 但 golang.md 的 tags 字段确实包含 "go"。请排查原因。
Claude Code 会:
1. 读取 searcher.go 和 parser.go 中的 tag 匹配逻辑
2. 定位问题(可能是大小写比较、字符串 trim 等问题)
3. 修复并重新运行测试
长对话中上下文可能接近窗口限制。使用以下命令管理:
/compact # 压缩对话历史,保留关键信息
/cost # 查看当前会话 token 使用量
/clear # 清空对话,从头开始(文件修改保留)
最佳实践:每完成一个功能模块后执行 /compact,保持上下文清洁。
> 初始化 Git 仓库,创建合适的 .gitignore,做第一次提交。
Claude Code 会:
git init
# 创建 .gitignore
git add .
git commit -m "feat: initial project structure with search and version commands"
每完成一个功能模块后:
> 查看当前修改,帮我写一个规范的 commit message 并提交。
Claude Code 会执行 git diff 分析变更,生成 Conventional Commits 格式的提交信息。
> 根据当前代码和 CLAUDE.md,生成一个专业的 README.md,
> 包含安装方式、使用示例、参数说明。
# 在 GitHub 创建仓库(需安装 gh CLI)
gh repo create yourname/mdfinder --public --source=. --push
# 打 tag 发布
git tag v0.1.0
git push origin v0.1.0
以下是一个完整的 Claude Code 会话实录,展示从零到交付的全过程:
flowchart TD
A[安装 Claude Code] --> B[创建项目目录]
B --> C[编写 CLAUDE.md]
C --> D[启动 claude 会话]
D --> E["/plan 设计架构"]
E --> F[搭建项目骨架]
F --> G[实现 parser 模块]
G --> H[实现 searcher 模块]
H --> I[实现 CLI 命令]
I --> J[运行测试]
J --> K{测试通过?}
K -->|否| L[调试修复]
L --> J
K -->|是| M[Git 提交]
M --> N[生成 README]
N --> O[发布到 GitHub]
O --> P["v0.1.0 发布完成 🎉"]
style A fill:#4A90D9,color:#fff
style E fill:#F5A623,color:#fff
style J fill:#7ED321,color:#fff
style P fill:#BD10E0,color:#fff
$ mkdir mdfinder && cd mdfinder
$ go mod init github.com/yourname/mdfinder
$ claude
╭──────────────────────────────────────────╮
│ Claude Code • claude-sonnet-4-6 │
│ Project: mdfinder │
╰──────────────────────────────────────────╯
> /plan
> 设计一个 Go CLI 工具,递归搜索目录中的 Markdown 文件...
[Plan Mode 输出架构设计]
> 按 Plan 创建项目骨架,先实现 version 子命令
[创建 cmd/mdfinder/main.go, go get cobra]
> 实现 parser 模块,解析 Markdown 提取标题和标签
[创建 internal/parser/markdown.go + _test.go]
> 运行 parser 测试
[go test ./internal/parser/ -v → PASS]
> /compact
[上下文压缩,保留关键设计决策]
> 实现 searcher 模块
[创建 internal/searcher/searcher.go + _test.go]
> 实现 search 子命令和彩色输出
[修改 main.go, 创建 internal/formatter/color.go]
> 创建测试数据并验证端到端搜索
[创建 testdata/, 运行搜索命令 → 正确输出]
> 运行所有测试
[go test ./... -v → 全部 PASS]
> 帮我初始化 Git,创建 .gitignore,提交
[git init, git commit]
> 生成 README.md
[创建 README.md]
> 查看总 token 使用量
/cost
# Session cost: ~$0.85 (120K input, 8K output tokens)
| 命令 | 用途 | 使用场景 |
|---|---|---|
/plan |
进入/退出规划模式 | 设计架构、分析需求时 |
/compact |
压缩对话历史 | 对话超过 20 轮时 |
/clear |
清空对话 | 切换任务时 |
/cost |
查看 token 消耗 | 控制预算时 |
/help |
查看帮助 | 忘记命令时 |
Shift+Tab |
切换 Plan Mode | 快捷键 |
Escape |
取消当前生成 | Claude 走偏时 |
# 单次执行,适合脚本和 CI
claude -p "运行所有测试并报告结果" --output-format json
# 管道输入
cat error.log | claude "分析这个错误日志的根本原因"
# 继续上次对话
claude --continue
# 指定模型
claude --model claude-opus-4-6
不要一次性提出所有需求。将开发分为设计 → 骨架 → 核心逻辑 → 测试 → 打磨五个阶段,每阶段结束后 /compact 一次。
复杂功能先在 Plan Mode 中讨论方案,确认后再实现。这避免了 Claude 写了大量代码后你发现方向不对。
差的提示:
> 在 searcher.go 第 42 行添加 strings.ToLower 调用
好的提示:
> 搜索 --tag "Go" 时匹配不到 tags: ["go"],应该是大小写敏感导致的,请修复
让 Claude 自己决定修复方案,通常比你指定更优。
随着项目演进,让 Claude Code 更新 CLAUDE.md:
> 根据目前项目的实际结构,更新 CLAUDE.md 中的项目结构和技术栈部分
使用多个终端窗口运行独立的 claude 会话,分别处理不同的模块。每个会话有自己的上下文窗口,互不干扰。
flowchart LR
subgraph "终端 1"
A1["claude"] --> A2["实现 parser"]
end
subgraph "终端 2"
B1["claude"] --> B2["实现 formatter"]
end
subgraph "终端 3"
C1["claude"] --> C2["编写测试"]
end
A2 --> D["git merge"]
B2 --> D
C2 --> D
在 CLAUDE.md 中添加更具体的编码规范。例如:
## 编码规范
- 错误处理:所有 error 必须检查,使用 `fmt.Errorf("functionName: %w", err)` 包装
- 命名:接口名以 `-er` 结尾(如 `Searcher`),实现名加 `Default` 前缀
- 测试:表驱动测试优先,使用 `t.Parallel()` 标记无依赖测试
规范越具体,Claude Code 的输出质量越高。
使用 /compact 时 Claude 会总结关键信息。如果仍然丢失,在 CLAUDE.md 中添加"设计决策"部分:
## 设计决策
- 搜索默认大小写不敏感,使用 `--case-sensitive` 开启敏感搜索
- YAML front matter 解析使用正则而非第三方库,减少依赖
- 索引格式使用 JSON,便于跨平台兼容
# 仅允许读取文件,不允许写入和执行命令
claude --permission-mode ask
# 完全信任(仅用于 CI 或自动化)
claude --dangerously-skip-permissions
# 在 settings.json 中精细配置
# ~/.claude/settings.json
{
"permissions": {
"allow": ["Read", "Glob", "Grep"],
"deny": ["Bash:rm *", "Bash:git push *"]
}
}
# 使用 .claudeignore 排除不需要的目录
echo "vendor/\nnode_modules/\n*.min.js" > .claudeignore
# 在 CLAUDE.md 中指定关键文件路径
最终项目结构:
mdfinder/
├── CLAUDE.md # 项目配置
├── README.md # 自动生成
├── go.mod
├── go.sum
├── .gitignore
├── .claudeignore # 排除 vendor/ 等
├── cmd/
│ └── mdfinder/
│ └── main.go # CLI 入口 + cobra 命令
├── internal/
│ ├── parser/
│ │ ├── markdown.go # Markdown 解析器
│ │ └── markdown_test.go
│ ├── searcher/
│ │ ├── searcher.go # 搜索引擎
│ │ └── searcher_test.go
│ ├── formatter/
│ │ ├── color.go # 彩色输出
│ │ └── color_test.go
│ └── index/
│ ├── indexer.go # 索引构建
│ └── indexer_test.go
├── testdata/
│ ├── golang.md
│ ├── react.md
│ └── python.md
└── bin/
└── mdfinder # 构建产物
| 训练营类型 | 适用性 | 教学时长 | 说明 |
|---|---|---|---|
| Go 语言入门营 | ★★★★★ | 4-6 小时 | 通过实战项目学习 Go 语法和 CLI 开发 |
| AI 辅助编程营 | ★★★★★ | 3-4 小时 | Claude Code 核心工作流全覆盖 |
| 全栈工程师训练营 | ★★★★☆ | 3 小时 | 作为工具链入门模块 |
| DevOps 自动化营 | ★★★☆☆ | 2 小时 | CLI 工具开发思路可迁移 |
前置训练:无需前置课程,本教程从零开始。
后续推荐: 1. Claude Code Skills 开发实战 — 创建自定义 Skill 2. Claude Code MCP 服务器开发 — 扩展 Claude Code 能力 3. Claude Code 自动化与 CI/CD 集成 — 无人值守工作流
[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。
