字
字节笔记本
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 框架 | Gin | HTTP Web 框架 |
| ORM | GORM | 数据库操作 |
| 日志 | Zap | 高性能日志库 |
| 验证 | validator/v10 | 请求参数验证 |
| 缓存 | go-redis | Redis 客户端 |
| 配置 | gopkg.in/ini.v1 | INI 配置文件解析 |
项目架构
项目采用包全局变量的方式初始化各组件,目录结构清晰明了:
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(¶m)
if err != nil {
r.Failed(ctx, ParamError, translate(err))
return
}
if article, err := r.ArticleService.Create(ctx, ¶m); err != nil {
r.Failed(ctx, Failed, err.Error())
} else {
r.Success(ctx, "添加文章成功", article)
}
}命名规范建议
项目推荐以下命名规范:
| 类型 | 规范 | 示例 |
|---|---|---|
| 表名/文件夹 | 单数、小写 | article、phone |
| 文件夹(多词) | 小写直连 | eventhandler |
| 文件名 | 小写下划线 | article_controller.go |
| 变量名 | 驼峰 | userId、pageSize |
| 结构体名 | 驼峰 | 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使用建议
- 删除示例代码:根据需求删除多余的控制器、模型文件
- 自定义修改:Go 代码简单易懂,可根据业务需求直接修改
- 遵循规范:建议采用项目推荐的命名规范
- 配置分离:使用不同的配置文件管理开发、测试、生产环境
项目链接
- GitHub 仓库:https://github.com/wangbjun/gen
- Stars:136
- Forks:25
- 许可证:Apache-2.0
总结
Gen Web 是一个轻量级但功能完整的 Go Web 脚手架,它没有过度设计,而是将优秀的开源组件合理组合,提供了一个简单、易用、易修改的开发基础。如果你正在寻找一个基于 Gin 的 Web 开发模板,Gen Web 值得参考。
分享: