6.7 文档生成
godoc 注释规范
基础注释
go
// Package main 提供应用程序入口
package main
import "fmt"
// User 表示用户信息
type User struct {
ID string // 用户唯一标识
Name string // 用户姓名
Email string // 电子邮箱
}
// UserService 提供用户相关服务
type UserService struct {
repo UserRepository
}
// NewUserService 创建新的用户服务
// 参数:
// - repo: 用户数据仓库
// 返回:
// - *UserService: 用户服务实例
func NewUserService(repo UserRepository) *UserService {
return &UserService{repo: repo}
}
// GetUser 根据 ID 获取用户
// 参数:
// - ctx: 上下文
// - id: 用户 ID
// 返回:
// - *User: 用户信息
// - error: 错误信息
// 示例:
// user, err := service.GetUser(ctx, "123")
// if err != nil {
// log.Fatal(err)
// }
func (s *UserService) GetUser(ctx context.Context, id string) (*User, error) {
return s.repo.GetByID(id)
}
// String 返回用户的字符串表示
func (u *User) String() string {
return fmt.Sprintf("User{%s, %s}", u.ID, u.Name)
}
// ErrUserNotFound 用户不存在错误
var ErrUserNotFound = errors.New("user not found")
// CreateUser 创建新用户
// 注意:创建前会验证邮箱格式
// BUG: 当邮箱已存在时返回模糊错误
func (s *UserService) CreateUser(ctx context.Context, name, email string) (*User, error) {
// ...
}注释最佳实践
go
// 好:简洁明了
// ParseInt 将字符串解析为整数
func ParseInt(s string) (int, error) { }
// 不好:重复函数名
// ParseInt 解析整数的函数
func ParseInt(s string) (int, error) { }
// 好:说明行为
// Close 关闭连接并释放资源
func (c *Conn) Close() error { }
// 不好:无意义
// Close 关闭东西
func (c *Conn) Close() error { }
// 好:包含示例
// Double 返回输入的两倍
// 例如:Double(3) = 6
func Double(x int) int { return x * 2 }Go Doc 生成
本地查看文档
bash
# 启动 godoc 服务器
godoc -http=:6060
# 访问 http://localhost:6060/pkg/your-module
# 命令行查看
go doc fmt
go doc fmt.Println
go doc -all fmt # 查看完整文档
go doc -src fmt.Println # 查看源码生成静态文档
bash
# 安装 pkgsite
go install golang.org/x/pkgsite/cmd/pkgsite@latest
# 生成本地文档
pkgsite -http=localhost:8080
# 生成文档到目录
pkgsite -generate ./... -outdir ./docsSwagger/OpenAPI
swag 安装与初始化
bash
# 安装 swag
go install github.com/swaggo/swag/cmd/swag@latest
# 初始化
swag init
# 指定主文件
swag init -g cmd/main.go
# 输出到指定目录
swag init -g cmd/main.go -o ./docs
# 生成时解析依赖包
swag init -g cmd/main.go --parseDependency
# 生成时解析内部包
swag init -g cmd/main.go --parseInternalAPI 注释
go
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
// @title 用户管理 API
// @version 1.0.0
// @description 用户管理系统的 RESTful API
// @termsOfService http://swagger.io/terms/
// @contact.name API Support
// @contact.email support@example.com
// @license.name MIT
// @license.url https://opensource.org/licenses/MIT
// @host api.example.com
// @BasePath /api/v1
// @securityDefinitions.apikey BearerAuth
// @in header
// @name Authorization
// @description 使用 JWT token,格式:Bearer {token}
// User 用户信息
// @description 用户数据模型
type User struct {
ID string `json:"id" example:"123"`
Name string `json:"name" example:"张三"`
Email string `json:"email" example:"zhangsan@example.com"`
Age int `json:"age" example:"25"`
}
// CreateUserRequest 创建用户请求
type CreateUserRequest struct {
Name string `json:"name" binding:"required" example:"张三"`
Email string `json:"email" binding:"required,email" example:"zhangsan@example.com"`
Age int `json:"age" binding:"min=0,max=150" example:"25"`
}
// CreateUser godoc
// @Summary 创建用户
// @Description 创建一个新的用户账号
// @Tags 用户
// @Accept json
// @Produce json
// @Param request body CreateUserRequest true "用户信息"
// @Success 200 {object} User
// @Failure 400 {object} ErrorResponse
// @Failure 401 {object} ErrorResponse
// @Failure 500 {object} ErrorResponse
// @Security BearerAuth
// @Router /users [post]
func (h *Handler) CreateUser(c *gin.Context) {
var req CreateUserRequest
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
user := &User{
Name: req.Name,
Email: req.Email,
Age: req.Age,
}
c.JSON(200, user)
}
// GetUser godoc
// @Summary 获取用户
// @Description 根据 ID 获取用户信息
// @Tags 用户
// @Accept json
// @Produce json
// @Param id path string true "用户 ID"
// @Success 200 {object} User
// @Failure 404 {object} ErrorResponse
// @Security BearerAuth
// @Router /users/{id} [get]
func (h *Handler) GetUser(c *gin.Context) {
id := c.Param("id")
// ...
}
// ListUsers godoc
// @Summary 用户列表
// @Description 获取用户列表,支持分页和搜索
// @Tags 用户
// @Accept json
// @Produce json
// @Param page query int false "页码" default(1)
// @Param limit query int false "每页数量" default(20)
// @Param keyword query string false "搜索关键字"
// @Success 200 {array} User
// @Security BearerAuth
// @Router /users [get]
func (h *Handler) ListUsers(c *gin.Context) {
// ...
}
// DeleteUser godoc
// @Summary 删除用户
// @Description 删除指定用户
// @Tags 用户
// @Accept json
// @Produce json
// @Param id path string true "用户 ID"
// @Success 204
// @Failure 404 {object} ErrorResponse
// @Security BearerAuth
// @Router /users/{id} [delete]
func (h *Handler) DeleteUser(c *gin.Context) {
// ...
}
// ErrorResponse 错误响应
type ErrorResponse struct {
Error string `json:"error"`
Message string `json:"message"`
}集成到 Gin
go
package main
import (
"net/http"
"github.com/gin-gonic/gin"
swaggerFiles "github.com/swaggo/files"
ginSwagger "github.com/swaggo/gin-swagger"
)
func main() {
r := gin.Default()
// Swagger UI
r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
// API 路由
api := r.Group("/api/v1")
{
api.POST("/users", handler.CreateUser)
api.GET("/users/:id", handler.GetUser)
api.GET("/users", handler.ListUsers)
api.DELETE("/users/:id", handler.DeleteUser)
}
r.Run(":8080")
}
// 在 main 函数中添加
// @securityDefinitions.apikey BearerAuth
// @in header
// @name Authorization生成的文件
docs/
├── docs.go // Go 初始化的文档
├── swagger.json // OpenAPI/Swagger JSON
└── swagger.yaml // OpenAPI/Swagger YAMLAPI 文档自动化
在 CI 中生成文档
yaml
# .github/workflows/docs.yml
name: Generate Docs
on:
push:
branches: [main]
jobs:
docs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Go
uses: actions/setup-go@v4
with:
go-version: '1.21'
- name: Install swag
run: go install github.com/swaggo/swag/cmd/swag@latest
- name: Generate docs
run: swag init -g cmd/main.go -o ./docs
- name: Deploy to GitHub Pages
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./docsREADME 编写规范
标准结构
markdown
# 项目名称
简短的项目描述。
[](https://goreportcard.com/report/github.com/user/repo)
[](https://github.com/user/repo/actions/workflows/test.yml)
[](https://pkg.go.dev/github.com/user/repo)
## 安装
```bash
go get github.com/user/repo快速开始
go
package main
import "github.com/user/repo"
func main() {
// 使用示例
}功能特性
- 特性 1
- 特性 2
- 特性 3
文档
示例
查看 examples/ 目录获取更多示例。
贡献
欢迎提交 Issue 和 Pull Request!
许可证
MIT License
---
## CHANGELOG 管理
### Keep a Changelog 格式
```markdown
# Changelog
所有重要的项目变更都将记录在此文件中。
格式基于 [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
项目遵循 [语义化版本](https://semver.org/spec/v2.0.0.html)。
## [Unreleased]
### Added
- 新增用户批量导入功能
### Changed
- 优化数据库查询性能
### Deprecated
- 旧版 API 端点 `/api/v1/legacy`
### Removed
- 移除已废弃的配置项
### Fixed
- 修复用户删除时的并发问题
### Security
- 升级依赖修复 CVE-2024-XXXX
## [1.0.0] - 2024-01-15
### Added
- 初始版本发布
- 用户 CRUD 操作
- JWT 认证
- 数据库迁移支持
### Changed
- 无
### Fixed
- 无文档检查清单
[ ] 所有导出的标识符都有注释
[ ] 注释以标识符名称开始
[ ] 注释简洁清晰,不冗余
[ ] 复杂函数包含示例
[ ] API 使用 Swagger 注释
[ ] README 包含安装和使用说明
[ ] CHANGELOG 记录重要变更
[ ] 文档与代码同步更新
[ ] 生成 Godoc 验证格式
[ ] Swagger 文档可正常访问