Skip to Content
🚀 APSO is now in public beta. Get started →
GuidesFrameworksGo (Gin)Overview

Go (Gin)

Coming soon. Go code generation is not yet available. TypeScript (NestJS) is the only stable language template today. The information below is a preview of the planned Go support.

The Go template uses Gin, a high-performance HTTP web framework written in Go.

Overview

ComponentTechnology
FrameworkGin
ORMGORM
Validationgo-playground/validator
Documentationswaggo/swag
Testinggo test

Quick Start

# Create a new Go service apso server new my-api --template go # Navigate to project cd my-api # Download dependencies go mod download # Start development server go run main.go # Or with hot reload air

Project Structure

my-api/ ├── cmd/ │ └── server/ │ └── main.go # Entry point ├── internal/ │ ├── entities/ # GORM models │ │ ├── project.go │ │ └── task.go │ ├── handlers/ # HTTP handlers │ │ ├── projects.go │ │ └── tasks.go │ ├── services/ # Business logic │ ├── repository/ # Database layer │ ├── middleware/ # HTTP middleware │ └── extensions/ # Your custom code ├── pkg/ # Shared packages │ ├── config/ │ └── database/ ├── migrations/ # Database migrations ├── .apsorc # APSO schema └── go.mod

Key Technologies

Gin

Fast and minimal framework:

  • High performance
  • Middleware support
  • Route grouping
  • Error handling

GORM

Type-safe ORM:

package entities import ( "time" "github.com/google/uuid" "gorm.io/gorm" ) type Project struct { ID uuid.UUID `gorm:"type:uuid;primaryKey"` Name string `gorm:"not null"` Description *string OrganizationID uuid.UUID `gorm:"not null;index"` Tasks []Task `gorm:"foreignKey:ProjectID"` CreatedAt time.Time UpdatedAt time.Time DeletedAt gorm.DeletedAt `gorm:"index"` } func (p *Project) BeforeCreate(tx *gorm.DB) error { p.ID = uuid.New() return nil }

Validation

Struct tag validation:

type CreateProjectRequest struct { Name string `json:"name" binding:"required,max=200"` Description *string `json:"description"` }

Handler Example

// internal/handlers/projects.go package handlers import ( "net/http" "github.com/gin-gonic/gin" "myapi/internal/services" ) type ProjectHandler struct { service *services.ProjectService } func NewProjectHandler(service *services.ProjectService) *ProjectHandler { return &ProjectHandler{service: service} } func (h *ProjectHandler) List(c *gin.Context) { user := c.MustGet("user").(*entities.User) projects, err := h.service.GetAll(c, user.OrganizationID) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, gin.H{"data": projects}) } func (h *ProjectHandler) Create(c *gin.Context) { var req CreateProjectRequest if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } user := c.MustGet("user").(*entities.User) project, err := h.service.Create(c, req, user.OrganizationID) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } c.JSON(http.StatusCreated, project) }

Route Setup

// cmd/server/main.go func setupRoutes(r *gin.Engine) { api := r.Group("/api/v1") api.Use(middleware.Auth()) projects := api.Group("/projects") { projects.GET("/", projectHandler.List) projects.POST("/", projectHandler.Create) projects.GET("/:id", projectHandler.Get) projects.PATCH("/:id", projectHandler.Update) projects.DELETE("/:id", projectHandler.Delete) } }

Configuration

Environment Variables

# .env DATABASE_URL=postgres://user:pass@localhost:5432/db JWT_SECRET=your-secret-key PORT=3001 GIN_MODE=debug

Config Loading

// pkg/config/config.go package config import "os" type Config struct { DatabaseURL string JWTSecret string Port string GinMode string } func Load() *Config { return &Config{ DatabaseURL: os.Getenv("DATABASE_URL"), JWTSecret: os.Getenv("JWT_SECRET"), Port: getEnvOrDefault("PORT", "3001"), GinMode: getEnvOrDefault("GIN_MODE", "debug"), } }

Commands

CommandDescription
go run main.goStart server
airStart with hot reload
go test ./...Run tests
go build -o bin/serverBuild binary
swag initGenerate Swagger docs

Features

Auto-Generated

  • GORM models with relationships
  • CRUD handlers
  • Request/response structs
  • Swagger annotations
  • Auth middleware

Customizable

  • Add custom handlers in extensions
  • Override service methods
  • Add middleware
  • Integrate external packages
Last updated on