swag init报错“cannot find package”的根本原因是未识别Go模块根目录或未启用Go Modules,需确保go.mod存在并cd至其所在目录执行;注释须紧贴handler函数且格式正确;Gin需手动挂载Swagger UI资源;类型推导不足时应显式声明参数与响应。
根本原因通常是 swag 没有识别到你的 Go 模块根目录,或项目未启用 Go Modules。它默认在当前路径找 go.mod,找不到就去 GOPATH 下搜,容易定位错包。
go.mod(没有就先运行 go mod init your-module-name)swag init 前,cd 到包含 go.mod 的目录,不要在子包里运行--parseVendor;若含外部依赖注释,加 --parseDependency
Swag 只解析带特定前缀的注释(如 // @Summary),且必须紧贴在函数声明上方,中间不能插其他语句或空行(除注释外)。
// @ 开头,大小写敏感,例如 // @Success 200 {object} model.User
http.ResponseWriter 和 *http.Request
json tag 才能被正确映射到文档中// @model 或 // @definitions 声明,否则生成时会跳过func GetUser(w http.ResponseWriter, r *http.Request) {
// @Summary 获取用户信息
// @ID get-user
// @Accept json
// @Produce json
// @Success 200 {object} UserResponse
// @Router /api/user/{id} [get]
}
Gin 默认不自动注册 Swagger UI 静态资源,需手动挂载 docs.SwaggerInfo 并启用 ginSwagger.WrapHandler。
swag init,生成了 docs/docs.go 和 docs/swagger.json
_ "your-project/docs"
router := gin.Default() 之后,且路径严格为 /swagger/*any
docs 目录是否被排除import (
"github.com/gin-gonic/gin"
_ "your-project/docs" // 这行必须有
ginSwagger "github.com/swaggo/gin-swagger"
"github.com/swaggo/gin-swagger/swaggerFiles"
)
func main() {
r := gin.Default()
r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
r.Run()
}
Swag 对类型推导有限,尤其面对接口、泛型(Go 1.18+)、指针嵌套或匿名字段时,常漏掉深层结构。
interface{} 作参数或返回值,改用具体 struct 并加 // @Param / @Success 显式声明*string),在 struct tag 中加 swaggertype:"string" 辅助识别// @Param body body models.User true "用户数据" 明确标注 body 参数,比仅靠函数签名更可靠swag v1.8.10+,对泛型支持更好,旧版本会直接跳过含 type parameter 的函数
对,而是 swag 在静默跳过某些文件——它不会报错,只当那些 handler 不存在。检查 docs/swagger.json 里有没有你刚写的接口 ID,没有就回头核对注释位置和 go.mod 路径。