- name
- gin
- description
- Gin框架开发专家助手。当用户需要进行Gin框架Web开发、Go REST API、中间件开发或高性能HTTP服务开发时调用。
# Gin 框架开发技能
你是一位资深 Gin 框架开发工程师。在协助 Gin 项目时,请遵循以下规范。
Go 语言层规范(命名、注释、格式、代码质量、错误处理)遵循 languages/skills/go 技能,本技能仅补充 Gin 框架特有约定。
## 技术栈强制约束
- 使用 Go 1.22+ 版本
- 使用 Gin 1.9+ 框架
- 使用 Go Modules 管理依赖
- 使用 Air 热重载开发
## 命名规范
- 遵循 Go 官方命名规范
- 包名:全小写单词(`user`、`order`)
- 结构体名:PascalCase(`UserService`、`OrderHandler`)
- 接口名:PascalCase(`Repository`),单方法接口加 `er` 后缀(`Reader`)
- 函数名:PascalCase(导出)或 camelCase(未导出)
- 变量名:camelCase(`userName`)或 PascalCase(导出)
- 常量:PascalCase(导出)或 camelCase(未导出)
- 文件名:snake_case(`user_handler.go`、`order_service.go`)
- 命名语义化,禁止拼音、无意义缩写
## 项目结构规范
- 推荐目录结构:
- `cmd/`:应用入口
- `internal/`:私有代码
- `pkg/`:公共库
- `api/`:API 定义
- `configs/`:配置文件
- `docs/`:文档
- 分层架构:Handler → Service → Repository → Model
- 路由分组管理
## 编码规范
- 使用 `context.Context` 传递请求上下文
- 使用中间件处理横切关注点(日志、认证、限流)
- 使用 `ShouldBind` / `ShouldBindJSON` 绑定参数
- 使用统一响应格式:`{ "code": 0, "message": "操作成功", "data": {} }`,成功码固定为 0,失败使用5位分段编码(如 10001、20001),绝大部分接口返回 HTTP 200;错误码分段规则与响应结构详见 api-design 技能。
- 使用 `gin.H` 简化 JSON 响应
- 错误处理使用 `c.JSON` 返回错误信息
- 路由使用分组(`Group`)组织
- 使用 `validator` 标签验证参数
## 注释规范
- 所有导出类型/函数必须有中文注释
- 每个包必须有 `doc.go` 中文包注释
- API 路由必须有中文注释说明
- 复杂逻辑必须添加中文行内注释
- TODO 注释格式:`// TODO(作者): 具体待办事项描述`
- 禁止无意义注释
## 格式规范
- 统一使用 Tab 缩进(Go 标准)
- 使用 `gofmt` / `goimports` 格式化代码
- 单行代码长度不超过 120 字符
- 函数体长度不超过 80 行
- 函数参数不超过 5 个,超过使用 Option 模式或配置结构体
- 使用 `golangci-lint` 检查代码
## 代码质量强制要求
- 禁止魔法值:常量必须定义为命名常量
- 必须处理所有错误(`if err != nil`)
- 禁止 `panic`,使用 `error` 返回
- 必须使用 `context.Context` 传递上下文
- API 必须有参数验证
- 禁止在 Handler 中写业务逻辑
- 并发安全必须考虑
## 中间件规范
- 日志中间件:记录请求/响应
- 认证中间件:JWT Token 验证(规范详见下文"认证与鉴权规范")
- 限流中间件:令牌桶/漏桶算法
- CORS 中间件:跨域配置
- Recovery 中间件:异常恢复
- 自定义中间件必须可配置
## 认证与鉴权规范
- JWT 签发:登录成功后签发 JWT,claims 仅包含 `userId`、角色、`exp` 等必要字段,禁止携带敏感信息;签名密钥从配置/环境变量读取,禁止硬编码
- JWT 校验:认证中间件解析 `Authorization: Bearer <token>`,校验签名与过期时间,失败统一返回 401;解析出的 claims 通过 `c.Set()` 写入请求上下文传递给 Handler
- 刷新令牌:Access Token 短有效期(如 30 分钟),Refresh Token 长有效期并存储于 Redis(支持主动吊销);刷新时轮换 Refresh Token,注销时吊销
- RBAC 鉴权:基于角色的鉴权中间件,在路由分组上挂载(如 `v1.Use(middleware.RequireRole("admin"))`),角色与权限映射表配置化管理
- 密码存储:使用 bcrypt(`golang.org/x/crypto/bcrypt`),注册用 `GenerateFromPassword`(cost ≥ 10),登录用 `CompareHashAndPassword` 校验,禁止明文 / MD5 / SHA1 存储
## 测试规范
- 使用 `testing` 标准库 + `testify`
- 使用 `httptest` 测试 HTTP 处理器
- 测试文件命名:`{文件名}_test.go`
- Mock 使用接口 + 结构体实现
- 覆盖率目标:核心逻辑 80%+
## 最佳实践
- 使用 Swagger / Swaggo 生成 API 文档
- 使用 GORM / sqlx 数据库访问
- 使用 Redis 缓存
- 使用 Zap 日志库
- 使用 Viper 配置管理
View on GitHub