Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

gothinkster/golang-gin-realworld-example-app

Open more actions menu

Repository files navigation

RealWorld Example App

CI Coverage Status License: MIT GoDoc

Golang/Gin codebase containing real world examples (CRUD, auth, advanced patterns, etc) that adheres to the RealWorld spec and API.

This codebase was created to demonstrate a fully fledged fullstack application built with Golang/Gin including CRUD operations, authentication, routing, pagination, and more.

Recent Updates

This project has been modernized with the following updates:

  • Go 1.21+: Updated from Go 1.15 to require Go 1.21 or higher
  • GORM v2: Migrated from deprecated jinzhu/gorm v1 to gorm.io/gorm v2
  • JWT v5: Updated from deprecated dgrijalva/jwt-go to golang-jwt/jwt/v5 (fixes CVE-2020-26160)
  • Validator v10: Updated validator tags and package to match gin v1.10.0
  • Latest Dependencies: All dependencies updated to their 2025 production-stable versions
  • RealWorld API Spec Compliance:
    • GET /profiles/:username now supports optional authentication (anonymous access allowed)
    • POST /users/login returns 401 Unauthorized on failure (previously 403)
    • GET /articles/feed registered as dedicated authenticated route
    • DELETE /articles/:slug and DELETE /articles/:slug/comments/:id return empty response body

Test Coverage

The project maintains high test coverage across all core packages:

Package Coverage
articles 93.4%
users 99.5%
common 85.7%
Total 90.0%

To generate a coverage report locally, run:

go test -coverprofile=coverage.out ./...
go tool cover -func=coverage.out

Dependencies (2025 Stable Versions)

Package Version Release Date Known Issues
gin-gonic/gin v1.10.0 2024-05 None; v1.11 has experimental HTTP/3 support
gorm.io/gorm v1.25.12 2024-08 None; v1.30+ has breaking changes
golang-jwt/jwt/v5 v5.2.1 2024-06 None; v5.3 only bumps Go version requirement
go-playground/validator/v10 v10.24.0 2024-12 None; v10.30+ requires Go 1.24
golang.org/x/crypto v0.32.0 2025-01 None; keep updated for security fixes
gorm.io/driver/sqlite v1.5.7 2024-09 None; requires cgo; use glebarez/sqlite for pure Go
gosimple/slug v1.15.0 2024-12 None
stretchr/testify v1.10.0 2024-10 None; v2 still in development

Directory structure

.
├── gorm.db
├── hello.go
├── common
│   ├── utils.go        //small tools function
│   └── database.go     //DB connect manager
├── users
|   ├── models.go       //data models define & DB operation
|   ├── serializers.go  //response computing & format
|   ├── routers.go      //business logic & router binding
|   ├── middlewares.go  //put the before & after logic of handle request
|   └── validators.go   //form/json checker
├── ...
...

Getting started

Install Golang

Make sure you have Go 1.21 or higher installed.

https://golang.org/doc/install

Environment Config

Environment variables can be set directly in your shell or via a .env file (requires a tool like source or direnv).

Available environment variables:

PORT=8080                     # Server port (default: 8080)
GIN_MODE=debug               # Gin mode: debug or release
DB_PATH=./data/gorm.db       # SQLite database path (default: ./data/gorm.db)
TEST_DB_PATH=./data/test.db  # Optional: SQLite database path used for tests

Example usage:

# Option 1: Set environment variables directly
export PORT=3000
export DB_PATH=./data/myapp.db
go run hello.go

# Option 2: Inline with command
PORT=3000 go run hello.go

See .env.example for a complete template.

Install Dependencies

From the project root, run:

go build ./...
go test ./...
go mod tidy

Run the Server

# Using default port 8080
go run hello.go

# Using custom port
PORT=3000 go run hello.go

Testing

From the project root, run:

go test ./...

or

go test ./... -cover

or

go test -v ./... -cover

depending on whether you want to see test coverage and how verbose the output you want.

Todo

  • More elegance config
  • ProtoBuf support
  • Code structure optimize (I think some place can use interface)
  • Continuous integration (done)

Test Coverage

Current test coverage (2026):

  • Total: 89.2%
  • articles: 92.1%
  • users: 99.5%
  • common: 85.7%

Run coverage report:

go test -coverprofile=coverage.out ./...
go tool cover -func=coverage.out
Morty Proxy This is a proxified and sanitized view of the page, visit original site.