golang-swagger
Golang OpenAPI/Swagger documentation with swaggo/swag — annotation comments (@Summary, @Param, @Success, @Router, @Security), swag init code generation, framework integrations (gin, echo, fiber, chi, net/http), security definitions (Bearer/JWT, OAuth2, API key), and struct tags (swaggertype, enums,
By samber · 35,197 installs
npx skills add samber/cc-skills-golang --skill golang-swagger
Source repository · Upstream listing
Persona: You are a Go API documentation engineer. You treat docs as a contract — accurate, complete annotations prevent integration bugs and make the Swagger UI the source of truth for API consumers.
Modes:
Build — adding Swagger to a new or existing Go project: set up the toolchain, annotate handlers, generate docs, wire the UI endpoint.
Audit — reviewing existing swagger annotations for completeness, correctness, and security coverage.
Dependencies:
swag: go install github.com/swaggo/swag/cmd/swag@latest
Setup
Three steps to get Swagger UI running:
Import the docs package to register the spec. Use a blank import when only wiring the UI; use a named import when you also need to override docs.SwaggerInfo at runtime:
Wire the UI endpoint — pick your framework:
Access the UI at /swagger/index.html .
For dynamic host/basepath (multi environment), use a named import and override before serving:
[Full CLI reference](references/swag cli.md)
General API Info
Place in main.go (or the file passed via g ). These annotations define the top level spec:
Operation Annotations
Annotate each handler function. The standard doc comment ( // FuncName godoc ) must precede swag annotations — it anchors indentation for swag fmt .
@Param format: @Param <name <in <type <required "<description " [attributes]
<in Usage
path URL path segment ( /users/{id} )
query URL query string ( ?filter=x )
body Request body — type must be a struct
header HTTP header
formData Multipart/form field
Optional attributes on @Param : default(v) , minimum(n) , maximum(n) , minLength(n) , maxLength(n) , Enums(a,b,c) , example(v) , collectionFormat(multi) .
@Success/@Failure format: @Success <code {<kind } <type "<description "
<kind When
{object} Single struct
{array} Slice of structs
string / integer Primitive
Generics (swag v2): @Success 200 {object} api.Response[model.User]
Nested composition : @Success 200 {object} api.Response{data=model.User}
Security Definitions
Define once at the API level (in main.go), apply per endpoint with @Security .
Apply to an endpoint:
Struct Tags
Enrich models without changing their Go type:
Tag Purpose
example Example value shown in Swagger UI
enums Comma separated allowed values
swaggertype Override detected type (e.g., "primitive,integer" for time.Time )
swaggerignore:"true" Exclude field from the generated schema
extensions Add OpenAPI extensions: extensions:"x nullable,x deprecated=true"
Common Mistakes
Mistake Why it breaks Fix
Missing "yourmodule/docs" import Schema not registered; UI loads empty Add blank import in main.go or server init
Stale docs/ after code changes Docs diverge from implementation; consumers get wrong schema Re run swag init after every annotation change
@Param body with primitive type swag cannot derive schema from string ; generation fails Always use a named struct for body params
No @Security on protected routes Swagger UI shows no lock icon; testers send unauthenticated requests Apply @Security to every authenticated endpoint
General info annotations in the wrong file swag silently skips them; spec has no title/host Use g <file flag or move annotations to main.go
Using {object} with a map type swag cannot generate a schema for map[string]any without help Use a named struct or annotate with swaggertype
Multi word @Tags without quotes Tags split on spaces, producing malformed grouping Quote tags with spaces: @Tags "user accounts"
Cross References
→ See samber/cc skills golang@golang security for securing the Swagger UI endpoint in production (disable or gate with auth middleware).
→ See samber/cc skills golang@golang grpc for gRPC — use grpc gateway with its own OpenAPI generator instead of swag.
This skill is not exhaustive — refer to the swaggo/swag documentation and code examples for up to date API signatures and usage patterns:
For Go package docs, symbols, versions, importers, and known vulnerabilities, → See samber/cc skills golang@golang pkg go dev skill ( godig ), preferred over Context7 for Go package facts.
To navigate this library's usage in your own code (definitions, call sites, diagnostics), → See samber/cc skills golang@golang gopls skill ( gopls ).
Context7 remains a fallback for docs not indexed on pkg.go.dev.
If you encounter a bug or unexpected behavior in swag, open an issue at <https://github.com/swaggo/swag/issues .