For generate API documentation, By Using swag (from swaggo) to generate Swagger/OpenAPI documentation in your Go projects. you can follow my step below
Install swag CLI tool (Only first time / Update Version)
- Install swag CLI tool with this command
go install github.com/swaggo/swag/cmd/swag@latest
- Test generates a sample document. Run this command in the root directory of your Go project, where your main.go
swag init
- if your main.go not located and root directory but located in [ROOT_PATH]/cmd/api/main.go you can use -g option to specify main.go location
swag init -g "cmd/api/main.go"
- result is an empty swagger doc
Add swag tag/annotation to your Go code
There are 2 locations
- main.go Example
// @title Calc EOD API // @version 1.0 // @description This is the API documentation for the Calc EOD project. // @termsOfService http://swagger.io/terms/ // @contact.name API Support // @contact.url http://www.example.com/support // @contact.email [email protected] // @license.name MIT // @license.url https://opensource.org/licenses/MIT // @host localhost:3000 // @BasePath / // @securityDefinitions.apiKey ApiKeyAuth // @in header // @name Authorization // @schemes http func main() { ... your logic }
- your handler function Example
// Login handles user login requests.
// @Summary Login user
// @Description Authenticate user and return JWT token
// @Tags auth
// @Accept json
// @Produce json
// @Param request body entities.LoginRequest true "Login Request"
// @Success 200 {object} entities.LoginResponse
// @Failure 400 {object} map[string]string
// @Failure 401 {object} map[string]string
// @Router /auth/login [post]
func (h *AuthHandler) Login(c *fiber.Ctx) error {
var request entities.LoginRequest
if err := c.BodyParser(&request); err != nil {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"error": "Invalid request body",
})
}
if err := utils.ValidateStruct(&request); err != nil {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"error": "Validation failed",
"details": err.Error(),
})
}
response, err := h.authService.Login(&request)
if err != nil {
return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{
"error": "Invalid email or password",
})
}
return c.Status(fiber.StatusOK).JSON(response)
}
// RefreshToken handles token refresh requests.
// @Summary Refresh JWT token
// @Description Refresh an expired JWT token
// @Tags auth
// @Accept json
// @Produce json
// @Param Authorization header string true "JWT Token"
// @Success 200 {object} map[string]string
// @Failure 401 {object} map[string]string
// @Router /auth/refresh-token [post]
func (h *AuthHandler) RefreshToken(c *fiber.Ctx) error {
token := c.Get("Authorization")
if token == "" {
return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{
"error": "Missing authorization token",
})
}
newToken, err := h.authService.RefreshToken(token)
if err != nil {
return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{
"error": "Invalid or expired token",
})
}
return c.Status(fiber.StatusOK).JSON(fiber.Map{
"token": newToken,
})
}
Note: you can use AI to help generate swag tag/annotation to your Go code. My prompt "I want you to add Swagger annotations to handler functions and select file auth_handler.go" in my Git Copilot Console
Update Doc Again
- run init command
swag init #or main.go not located and root directory such as cmd/api/main.go swag init -g "cmd/api/main.go"
Add Swagger UI to your project
Install the middleware for your web framework (for example, gin):
- gin
go get -u github.com/swaggo/gin-swagger go get -u github.com/swaggo/files
import (
"github.com/gin-gonic/gin"
"github.com/swaggo/gin-swagger"
"github.com/swaggo/files"
_ "your/project/docs" // docs is generated by Swag CLI, you have to import it.
)
func main() {
r := gin.Default()
// ...
r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
r.Run()
}- fiber
go get github.com/gofiber/swagger
import (
"github.com/gofiber/fiber/v2"
"github.com/gofiber/swagger"
_ "your/module/docs" // replace with your module path
)
func main() {
app := fiber.New()
// Swagger route
app.Get("/swagger/*", swagger.HandlerDefault) // default route
// Your other routes...
app.Listen(":8080")
}- echo
go get github.com/swaggo/echo-swagger
import (
"github.com/labstack/echo/v4"
echoSwagger "github.com/swaggo/echo-swagger"
_ "your/module/docs" // replace with your module path
)
func main() {
e := echo.New()
// Swagger route
e.GET("/swagger/*", echoSwagger.WrapHandler)
// Your other routes...
e.Logger.Fatal(e.Start(":8080"))
}And access your swagger doc via [YOUR_BASE_PATH]/swagger/index.html, the image below is Go fiber example

Reference
Discover more from naiwaen@DebuggingSoft
Subscribe to get the latest posts sent to your email.



