其他
在 Go 项目中添加或维护 Swagger/OpenAPI…
为 Go 项目(gin/echo/fiber/chi/net/http)添加或审计 Swagger/OpenAPI 文档,通过注解注释、swag init 生成与 UI 挂载完成。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 47/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 51/100 ×0.15
适用场景
在 Go 项目中添加或维护 Swagge通用
解决思路
- 安装 swag CLI:go install github.com/swaggo/swag/cmd/swag@latest
- 运行 swag init 生成 docs/ 目录(含 docs.go、swagger.json、swagger.yaml);若通用信息不在 main.go,用 swag init -g cmd/api/main.go 指定入口文件
- 用 swag fmt 格式化注解注释(类似 go fmt)
- 导入 docs 包以注册 spec:仅挂载 UI 时用空白导入 import _ "yourmodule/docs";需要在运行时覆盖 docs.SwaggerInfo 时用命名导入 import docs "yourmodule/docs"
- 按框架挂载 UI 端点:Gin 用 r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler));Echo 用 e.GET("/swagger/*", echoSwagger.WrapHandler);Fiber 用 app.Get("/swagger/*", fiberSwagger.WrapHandler(swaggerFiles.Handler));net/http 用 mux.Handle("/swagger/", httpSwagger.Handler(swaggerFiles.Handler));Chi 用 r.Get("/swagger/*", httpSwagger.Handler(swaggerFiles.Handler));访问 /swagger/index.html 查看 UI
- 多环境动态 host/basepath:使用命名导入后,在服务前设置 docs.SwaggerInfo.Host = os.Getenv("API_HOST") 与 docs.SwaggerInfo.BasePath = "/api/v1"
- 在 main.go(或 -g 指定的文件)中放置通用 API 信息注解:@title、@version、@description、@host、@BasePath、@schemes、@contact.name、@contact.email、@license.name
- 在每个 handler 函数上添加操作注解,且标准文档注释(// FuncName godoc)必须位于 swag 注解之前,用于锚定 swag fmt 的缩进
- 使用 @Param 格式:@Param <name> <in> <type> <required> "<description>" [attributes];<in> 可为 path、query、body、header、formData;可选属性包括 default(v)、minimum(n)、maximum(n)、minLength(n)、maxLength(n)、Enums(a,b,c)、example(v)、collectionFormat(multi)
- 使用 @Success/@Failure 格式:@Success <code> {<kind>} <type> "<description>";<kind> 为 {object}(单个结构体)、{array}(结构体切片)或 string/integer(原始类型)
- 使用泛型(swag v2):@Success 200 {object} api.Response[model.User];使用嵌套组合:@Success 200 {object} api.Response{data=model.User}
- 在 API 级别(main.go)定义安全方案,用 @Security 按端点应用:Bearer/JWT 用 @securityDefinitions.apikey Bearer + @in header + @name Authorization;API key 用 @securityDefinitions.apikey ApiKeyAuth + @in header + @name X-API-Key;Basic auth 用 @securityDefinitions.basic BasicAuth;OAuth2 authorization code 用 @securityDefinitions.oauth2.authorizationCode OAuth2 + @authorizationUrl + @tokenUrl + @scope.read/@scope.write
- 按端点应用安全:@Security Bearer;@Security OAuth2[read, write];@Security BasicAuth && ApiKeyAuth(AND 表示两者都必需)
- 用结构体标签丰富模型而不改变 Go 类型:example、enums、minimum/maximum、minLength/maxLength、swaggertype(如 []byte 用 swaggertype:"string" format:"base64",time.Time 用 "primitive,integer")、swaggerignore:"true" 排除字段、extensions 添加 OpenAPI 扩展(如 extensions:"x-nullable,x-deprecated=true")
- 避免常见错误:确保导入 _ "yourmodule/docs" 以注册 schema;每次注解变更后重新运行 swag init 防止 docs/ 过期;body 参数必须用命名结构体而非原始类型;受保护路由必须加 @Security;通用信息注解放在正确文件或用 -g 指定;不要对 map 类型用 {object},改用命名结构体或 swaggertype;含空格的 @Tags 要加引号如 @Tags "user accounts"
- 生产环境安全:参考 samber/cc-skills-golang@golang-security 禁用或用认证中间件保护 Swagger UI 端点
- gRPC 场景改用 grpc-gateway 及其 OpenAPI 生成器,而非 swag
- 查阅 Go 包文档、符号、版本、导入方与已知漏洞时优先用 samber/cc-skills-golang@golang-pkg-go-dev(godig);导航本库在自身代码中的用法(定义、调用点、诊断)用 samber/cc-skills-golang@golang-gopls(gopls);Context7 作为 pkg.go.dev 未索引文档的兜底
- 遇到 swag 的 bug 或异常行为,在 https://github.com/swaggo/swag/issues 提交 issue
适用边界 · 注意事项
- 使用 gRPC 的项目——应改用 grpc-gateway 及其自带的 OpenAPI 生成器,而非 swag
- 未安装 go 与 swag CLI 的环境无法执行 swag init/swag fmt
- 生产环境直接暴露 Swagger UI 端点而不做认证或禁用,会泄露 API 结构