字节笔记本

2026年2月23日

Gen Web:基于 Gin 的 Go Web 脚手架工具

本文介绍 Gen Web,一个基于 Gin 框架开发的 Go Web 脚手架工具。该项目集成了数据库、日志、配置等常用组件,提供开箱即用的 RESTful API 开发体验,帮助开发者快速搭建 Go Web 后端服务。

项目简介

Gen Web 是由 wangbjun 开发维护的开源项目,截至目前在 GitHub 上已获得 136 stars 和 25 个 fork。该项目采用 100% Go 语言编写,遵循 Apache-2.0 开源协议。

与 Java 的 Spring 或 PHP 的 Laravel 不同,Go 语言在 Web 框架领域缺乏一个被广泛认可的完整解决方案。Gen Web 的目标就是填补这一空白,提供一个简单易用、功能完整的 Web 开发脚手架。

核心特性

  • 基于 Gin 框架:继承 Gin 的高性能和简洁 API 设计
  • 完整的技术栈集成:路由、日志、ORM、配置管理、中间件一站式解决
  • 全链路日志追踪:基于 Zap 实现,支持 traceId 贯穿请求全生命周期
  • 多数据库支持:通过 GORM 支持 MySQL、PostgreSQL 等多种数据库,可配置多数据源
  • MVC 分层架构:清晰的 controller -> service -> model 三层结构
  • 开箱即用:包含完整的文章增删改查示例,可直接参考或修改

技术栈

组件用途
Web 框架GinHTTP Web 框架
ORMGORM数据库操作
日志Zap高性能日志库
验证validator/v10请求参数验证
缓存go-redisRedis 客户端
配置gopkg.in/ini.v1INI 配置文件解析

项目架构

项目采用包全局变量的方式初始化各组件,目录结构清晰明了:

text
├── config          // 配置管理
├── controller      // 控制器层
├── log            // 日志模块
├── middleware     // 中间件
├── model          // 数据模型
├── router         // 路由定义
├── service        // 业务逻辑层
└── util           // 工具函数

API 示例

项目内置了一套完整的文章管理 RESTful API:

方法路径说明
GET/默认首页
GET/api/v1/articles文章列表
POST/api/v1/articles发布文章
GET/api/v1/articles/:id文章详情
PUT/api/v1/articles/:id修改文章
DELETE/api/v1/articles/:id删除文章
GET/api/v1/articles/:id/comments查看评论
POST/api/v1/articles/:id/comments添加评论

核心模块详解

1. 配置管理

采用 INI 格式配置文件,支持多环境配置(如 app_dev.ini 用于开发环境):

go
var cfg *App

func Get() *App {
    return cfg
}

type App struct {
    Env        string
    HttpPort   string
    LogFile    string
    LogConsole bool
    LogLevel   string
    *ini.File
}

可通过 -conf 参数指定配置文件,默认使用 app.ini

2. 日志系统

基于 Zap 封装,实现了全链路日志追踪:

go
var zapLogger *zap.Logger

type Logger struct {
    context.Context
    *zap.Logger
}

// WithCtx 创建带请求上下文的 Logger
func WithCtx(ctx context.Context) *Logger {
    return &Logger{ctx, zapLogger}
}

特色功能:

  • 自动注入 traceId
  • GORM SQL 日志也携带 traceId
  • 支持上下文传递

3. 数据库操作

使用 GORM 作为 ORM,支持多数据库连接:

go
var connPool = make(map[string]*gorm.DB)

// NewOrm 获取数据库连接,默认返回 default 数据库
func NewOrm(ctx context.Context, dbName ...string) *gorm.DB {
    conn := connPool["default"]
    if len(dbName) > 0 {
        if cn, ok := connPool[dbName[0]]; ok {
            conn = cn
        }
    }
    return conn.WithContext(ctx)
}

4. 控制器示例

采用结构体成员函数方式组织代码:

go
type articleController struct {
    *Controller
    *service.ArticleService
}

var ArticleController = articleController{
    Controller:    BaseController,
    ArticleService: service.NewArticleService(),
}

// Create 添加文章
func (r articleController) Create(ctx *gin.Context) {
    var param model.CreateArticleCommand
    err := ctx.ShouldBindJSON(&param)
    if err != nil {
        r.Failed(ctx, ParamError, translate(err))
        return
    }
    if article, err := r.ArticleService.Create(ctx, &param); err != nil {
        r.Failed(ctx, Failed, err.Error())
    } else {
        r.Success(ctx, "添加文章成功", article)
    }
}

命名规范建议

项目推荐以下命名规范:

类型规范示例
表名/文件夹单数、小写articlephone
文件夹(多词)小写直连eventhandler
文件名小写下划线article_controller.go
变量名驼峰userIdpageSize
结构体名驼峰type userService struct
函数名驼峰func getUserById()

快速开始

bash
# 克隆项目
git clone https://github.com/wangbjun/gen.git
cd gen

# 安装依赖
go mod download

# 修改配置
cp app.ini app_dev.ini
# 编辑 app_dev.ini 配置数据库等参数

# 运行
go run main.go -conf=app_dev.ini

使用建议

  1. 删除示例代码:根据需求删除多余的控制器、模型文件
  2. 自定义修改:Go 代码简单易懂,可根据业务需求直接修改
  3. 遵循规范:建议采用项目推荐的命名规范
  4. 配置分离:使用不同的配置文件管理开发、测试、生产环境

项目链接

总结

Gen Web 是一个轻量级但功能完整的 Go Web 脚手架,它没有过度设计,而是将优秀的开源组件合理组合,提供了一个简单、易用、易修改的开发基础。如果你正在寻找一个基于 Gin 的 Web 开发模板,Gen Web 值得参考。

分享: