如何用好 Claude Code 写后端代码
作为后端开发者,你大概也发现了:我们每天写的东西,有相当一部分是重复的。Controller、Service、Repository、DTO、验证规则、测试……一个接口下来,几十行代码里真正“需要动脑子”的部分可能不到一半。
剩下的,都是“样板”。
我之前试过不少 AI 工具,大部分都能帮你“写点东西”。但 Claude Code 不太一样——它不只是个对话窗口,它是一个能读你仓库、改你文件、跑你命令的 Agent。
简单说:它不止会说,还会动手。
下面会用claude code+Go作为例子来说明
先把它装上
Claude Code 是个终端里的工具,安装很简单:
npm install -g @anthropic-ai/claude-code
装完之后,在项目根目录输入:
claude
会走一个浏览器登录流程,或者你也可以直接配 API Key:
export ANTHROPIC_API_KEY=你的key
然后就能用了。
如果不想开一整个会话,只想快速问个问题:
claude -p "这个项目是干嘛的?"
或者把日志丢给它分析:
cat error.log | claude -p "帮我看看这些报错是什么原因"
先告诉 Claude 你的项目长什么样
Claude Code 每次启动都是“第一次见面”。它不知道你的项目结构、代码风格、测试习惯。所以你最好在项目根目录放一个 CLAUDE.md 文件,相当于给 Claude 一份“新人入职手册”。
比如一个 Go 项目可以这样写:
# 项目:用户服务
## 技术栈
- Go 1.22
- Gin
- GORM
- PostgreSQL
- Redis
- Kafka
## 代码规范
- 错误处理用 `fmt.Errorf` + `%w` 包装
- 日志用 `log/slog`
- Repository 层放在 `internal/repository`
- Service 层放在 `internal/service`
- Handler 放在 `internal/handler`
- DTO 放在 `internal/dto`
## 测试
- 单元测试用 `testing` + `testify`
- 集成测试用 `testcontainers-go`
- 跑测试:`go test ./...`
- 跑单个测试:`go test -run TestXxx ./...`
## 关键文件
- `configs/config.yaml` – 配置文件
- `docker-compose.yml` – 本地开发环境
## 注意事项
- 不要用 `panic` 处理业务错误
- 所有外部调用都要传 `context.Context`
Claude 每次启动都会读这个文件,省得你每次都要重新解释一遍项目背景。
除了这个,也需要熟练掌握一些常用命令

比如对如微服务的开发,这里,你可以使用add-dir添加多个目录
claude --add-dir ../user-service --add-dir ../payment-service
用它干点实际的活
1. 一键生成一个完整的接口
比如你想加一个创建订单的接口,可以直接说:
帮我加一个
POST /orders接口,接收CreateOrderRequest,包含customer_id、items(product_id+quantity)、shipping_address。用 Gin 实现,按项目的目录结构来。
Claude 会生成:
// internal/dto/order.go
type CreateOrderRequest struct {
CustomerID int64 `json:"customer_id" binding:"required"`
Items []OrderItemRequest `json:"items" binding:"required,min=1"`
ShippingAddress string `json:"shipping_address" binding:"required"`
}
type OrderItemRequest struct {
ProductID int64 `json:"product_id" binding:"required"`
Quantity int `json:"quantity" binding:"required,gt=0"`
}
// internal/handler/order_handler.go
func (h *OrderHandler) CreateOrder(c *gin.Context) {
var req dto.CreateOrderRequest
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
order, err := h.service.CreateOrder(c.Request.Context(), req)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusCreated, order)
}
Service 和 Repository 层它也会一起生成,而且会遵循你在 CLAUDE.md 里写的包结构。
2. 帮你写测试
不想手写测试的时候,直接说:
给
OrderService写单元测试,覆盖正常创建、空订单列表、客户不存在的情况。
它会读 OrderService 的代码,然后生成对应的测试:
func TestOrderService_CreateOrder(t *testing.T) {
mockRepo := new(MockOrderRepository)
mockCustomerRepo := new(MockCustomerRepository)
svc := NewOrderService(mockRepo, mockCustomerRepo)
t.Run("正常创建订单", func(t *testing.T) {
req := dto.CreateOrderRequest{
CustomerID: 1,
Items: []dto.OrderItemRequest{{ProductID: 10, Quantity: 2}},
ShippingAddress: "123 Main St",
}
mockCustomerRepo.On("FindByID", int64(1)).Return(&Customer{ID: 1}, nil)
mockRepo.On("Save", mock.Anything).Return(&Order{ID: 100}, nil)
resp, err := svc.CreateOrder(context.Background(), req)
assert.NoError(t, err)
assert.Equal(t, int64(100), resp.OrderID)
})
t.Run("客户不存在", func(t *testing.T) {
req := dto.CreateOrderRequest{CustomerID: 999}
mockCustomerRepo.On("FindByID", int64(999)).Return(nil, errors.New("not found"))
_, err := svc.CreateOrder(context.Background(), req)
assert.Error(t, err)
})
}
3. 读日志帮你 debug
报错看不懂的时候:
cat logs/app.log | claude -p "这个 Kafka 消费者报错 SerializationException,可能是什么原因?"
它会结合你的代码上下文,告诉你可能是序列化配置不对、或者消息格式变了。
4. 跨文件重构
想改一个东西,懒得手动搜所有引用:
把
OrderEntity重命名为Order,更新所有引用、GORM 注解和 repository 接口。
它会找到所有用到的地方,一次性改完。
几个我觉得好用的命令
| 命令 | 作用 |
|---|---|
/init |
在当前项目生成 CLAUDE.md |
/review |
审查当前改动,给建议 |
/compact |
对话太长时压缩上下文 |
/clear |
清空会话历史 |
/model |
切换模型 |
用它写后端代码,我觉得值在哪
Claude Code 不会替你思考业务逻辑,但它确实帮你把“重复劳动”那部分砍掉了大半。
它的优势在于:它知道你整个项目长什么样,而不是只看到你当前打开的那个文件。
所以它给你生成的代码,通常是能直接放进项目里的——而不是那种“改改就能用”的伪代码。
当然,该 review 的还是要 review。它有时候会过度设计,有时候会忽略一些边界情况。但整体上,它把我从“手写样板代码”的环节里解放了出来,让我能把注意力放在更值得花时间的地方。
如果你也在做后端,尤其是那种 CRUD 占了大头的项目,Claude Code 值得试一试。它像一个不太完美但很积极的同事——有时候你会怀疑它在自作聪明,但你也确实不想回到没有它的日子了。
更多推荐



所有评论(0)