top of page
  • Linkedin

Swagger ( OpenAPI ) for Go Developers: From Code to Fully Documented Gin APIs with Complete Annotation Guide

  • Writer: Avinash Ghadshi
    Avinash Ghadshi
  • Jun 15
  • 4 min read

Updated: Jun 17

API documentation is essential for helping developers understand how to use your API effectively. It improves collaboration, speeds up development, and reduces support and onboarding time. Clear, consistent docs also serve as a contract between frontend and backend teams, preventing miscommunication. In this blog "Swagger ( OpenAPI ) for Go Developers" we will see how to generate effective api document with less effort.


Swagger for Go Developers: From Code to Documentation
Swagger for Go Developers: From Code to Documentation

Swagger for Go developers

Swagger (OpenAPI) is a powerful tool for designing, documenting, and testing RESTful APIs. For Go developers, tools like swaggo/swag allow easy generation of Swagger docs using code annotations. Swagger improves developer experience with interactive docs, auto-generated schemas, and live testing interfaces.


Gin as a web framework for Go

Gin is a fast, minimalist web framework for building APIs and web services in Go. It offers routing, middleware support, JSON rendering, and strong performance under high concurrency. Gin's simplicity and speed make it a favorite choice for modern Go developers building scalable APIs.


Core Swagger Components

  • Swagger UI: A browser-based interface for visualizing and interacting with APIs. In this blog, our primary focus is on the Swagger UI component.

  • Swagger Editor: An online editor to write, preview, and validate OpenAPI specifications.

  • Swagger Codegen: A tool that generates client SDKs, server stubs, and documentation in various languages from a Swagger/OpenAPI spec.


Setting Up a Go Environment

To begin developing with Go and the Gin framework, ensure you have Go installed on your system (recommended version: 1.21 or higher). Set up your Go workspace and initialize your project using go mod init. Gin is a lightweight web framework that makes it easy to build RESTful APIs with minimal setup and high performance.


  • To install Gin, run the following command in your project directory:

Once installed, you can start building APIs using Gin’s simple and expressive routing and middleware system. A basic server can be up and running with just a few lines of code.


  • To integrate Swagger (OpenAPI) documentation into a Go project using Gin, follow these steps:


  • Create Swagger annotations in your main.go or entry file

// @title Example Gin API
// @version 1.0
// @description This is a sample server using Gin and Swagger.
// @host localhost:8080
// @BasePath /api/v1
// @schemes http
  • Use below command to generate Swagger docs:

swag init
  • If your entry file is not main.go then you need to hit below query. Let's assume name of your entry file is myfile.go

swag init --generalInfo myfile.go

This generates docs/ with swagger.json and swagger.yaml.


  • Import and register Swagger UI in your Gin router:

import (
    "github.com/gin-gonic/gin"
    "github.com/swaggo/gin-swagger"
    "github.com/swaggo/files"
    _ "your_module_name/docs" // This is important: it registers Swagger docs
)

  • Add Swagger middleware route to your router:

r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))

Now, visiting http://localhost:8080/swagger/index.html shows the Swagger UI.


Example: Complete main.go

package main
import (
    "github.com/gin-gonic/gin"
    "github.com/swaggo/gin-swagger"
    "github.com/swaggo/files"
    _ "your_module_name/docs" // Replace with your original module name
)

// @title Example Gin Swagger API
// @version 1.0
// @description Sample Swagger integration with Gin
// @host localhost:8080
// @BasePath /api/v1
func main() {
    r := gin.Default()

    r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))

    api := r.Group("/api/v1")
    api.GET("/hello", HelloHandler)

    r.Run(":8080")
}

// @Summary Greet user
// @Description Returns a welcome message
// @Tags example
// @Accept json
// @Produce json
// @Success 200 {object} map[string]string
// @Router /hello [get]
func HelloHandler(c *gin.Context) {
    c.JSON(200, gin.H{"message": "Hello, Swagger with Gin!"})
}

Swagger API UI

Gin Swagger API UI
Gin Swagger API UI

Find code link (Demo code) under Additional Resource Section at the end of this blog with all annotations and more http methods (GET, PUT, POST, DELETE)


Top-Level API Metadata Annotations

These are typically added at the top of main.go to define your API’s global information.

Annotation

Description

@title

Title of the API documentation.

@version

Version of the API.

@description

A detailed description of the API.

@termsOfService

Terms of service URL.

@contact.name

Name of the contact person/team.

@contact.url

URL to contact information.

@contact.email

Email for contacting API support.

@license.name

License name.

@license.url

URL to the license text.

@host

API server host (e.g., localhost:8080).

@BasePath

Base path for all API endpoints (e.g., /api/v1).


Route/Handler-Level Annotations

These annotations describe individual endpoint behaviors and responses. Place them above handler functions.

Annotation

Description

@Summary

Short summary of what the endpoint does.

@Description

Detailed explanation of the endpoint.

@Tags

Logical tags to group endpoints (e.g., "Users").

@Accept

MIME types the endpoint consumes (e.g., json, xml).

@Produce

MIME types the endpoint returns (e.g., json).

@Param

Defines parameters (path, query, header, body, form).

@Success

Defines successful responses.

@Failure

Defines failure responses.

@Router

Defines endpoint path and HTTP method.

@Security

Applies security requirements to endpoint.


Tips for Structuring Annotations for Better Readability

  • Group endpoints logically using @Tags (e.g., @Tags auth, @Tags users) for intuitive navigation in Swagger UI.

  • Use multi-line comments for longer @Description fields to provide context without cluttering.

  • Maintain consistent ordering of annotations: Summary → Description → Tags → Accept/Produce → Params → Success/Failure → Router.


Example for good structure:

// @Summary      Login user
// @Description  Authenticates a user and returns a JWT token.
// @Tags         auth
// @Accept       json
// @Produce      json
// @Param        credentials  header  string  true  "Encrypted user credentials"
// @Success      200  {object}  TokenResponse
// @Failure      401  {object}  ErrorResponse
// @Router       /login [post]

Common Mistakes to Avoid with Swagger

  • Missing or incorrect @Router paths: This causes endpoints to be omitted from the documentation.

  • Inaccurate parameter types or locations (e.g., marking a body param as query).

  • Forgetting to annotate new endpoints or structs, leading to undocumented or partially documented APIs.

  • Not running swag init after updates, resulting in outdated Swagger output.


Additional Resources

2 Comments


gicavir586
Jun 17

Like
Avinash Ghadshi
Avinash Ghadshi
Jul 08
Replying to

Thank you so much

Like
bottom of page