一个基于 Gin 框架的企业级 Go Web 应用模板,采用清晰的分层架构设计,内置依赖注入、健康检查、配置管理等企业级功能。
| 企业微信 | |
|---|---|
![]() | ![]() |
| QQ群:1021660914 点击链接加入群聊【木雷坞开源家】 | 扫描上方二维码加入微信群 |
git clone https://cnb.cool/mliev/examples/go-web
cd go-web
项目Fork后执行初始化脚本,自动替换模块路径:
./init.sh
# 复制配置文件
cp config.yaml.example config.yaml
# 编辑配置文件
vim config.yaml
go mod tidy
# 开发模式
go run main.go
# 或使用 Makefile
make run
go-web/ ├── main.go # 程序入口 ├── go.mod # Go模块定义 ├── go.sum # 依赖版本锁定 ├── README.md # 项目说明文档 ├── config.yaml.example # 配置文件示例 ├── config.yaml # 配置文件 ├── init.sh # 项目初始化脚本 ├── Dockerfile # Docker构建文件 ├── docker-compose.yml # Docker编排文件 ├── Makefile # 构建脚本 ├── LICENSE # 许可证文件 ├── app/ # 应用核心代码 │ ├── controller/ # 控制器层 │ │ ├── base_response.go # 统一响应封装 │ │ ├── health_controller.go # 健康检查 │ │ └── index_controller.go # 首页控制器 │ ├── service/ # 服务层(业务逻辑) │ ├── dao/ # 数据访问层 │ │ └── test_demo_dao.go │ ├── model/ # 数据模型 │ │ └── test_demo.go │ ├── dto/ # 数据传输对象 │ │ ├── health_dto.go │ │ └── response_dto.go │ └── middleware/ # 中间件 │ └── cors_middleware.go ├── cmd/ # 命令行入口 │ └── run.go # 启动逻辑 ├── config/ # 配置管理 │ ├── assembly.go # 依赖注入配置 │ ├── config.go # 基础配置 │ ├── migration.go # 迁移配置 │ ├── server.go # 服务器配置 │ └── autoload/ # 自动加载配置 │ ├── base.go │ ├── database.go │ ├── middleware.go │ ├── redis.go │ └── router.go ├── constants/ # 常量定义 │ └── errors.go # 错误码定义 ├── docs/ # 文档 │ ├── PROJECT_SPECIFICATION.md │ └── TEMPLATE_INIT.md ├── internal/ # 内部包 │ ├── helper/ # 内部助手 │ │ └── helper.go │ ├── interfaces/ # 接口定义 │ │ ├── assembly.go │ │ ├── config.go │ │ ├── database.go │ │ ├── env.go │ │ ├── helper.go │ │ ├── logger.go │ │ ├── redis.go │ │ └── server.go │ ├── pkg/ # 内部包实现 │ │ ├── config/ # 配置包 │ │ ├── database/ # 数据库包 │ │ ├── demo/ # 示例包 │ │ ├── env/ # 环境变量包 │ │ ├── http_server/ # HTTP服务器包 │ │ ├── logger/ # 日志包 │ │ └── redis/ # Redis包 │ └── service/ # 内部服务 │ └── migration/ # 迁移服务 │ └── migration.go └── util/ # 工具函数 ├── base_62.go └── generate_utils.go
| 技术 | 版本 | 描述 |
|---|---|---|
| Go | 1.23.2 | 编程语言 |
| Gin | 1.10.1 | Web框架 |
| GORM | 1.25.12 | ORM框架 |
| MySQL/PostgreSQL | - | 关系型数据库 |
| Redis | - | 缓存数据库 |
| Viper | 1.19.0 | 配置管理 |
| Zap | 1.27.0 | 结构化日志 |
┌─────────────────────────────────┐ │ HTTP Layer │ │ (Gin Router & Middleware) │ ├─────────────────────────────────┤ │ Controller Layer │ │ (Request/Response Handling) │ ├─────────────────────────────────┤ │ Service Layer │ │ (Business Logic) │ ├─────────────────────────────────┤ │ DAO Layer │ │ (Data Access Objects) │ ├─────────────────────────────────┤ │ Model Layer │ │ (Database Models) │ └─────────────────────────────────┘
项目采用 Assembly 模式实现依赖注入:
// Assembly 接口
type AssemblyInterface interface {
Assembly()
}
// 配置装配顺序
func (receiver AssemblyConfig) Get() []interfaces.AssemblyInterface {
return []interfaces.AssemblyInterface{
assembly.Env{}, // 环境配置
assembly.Logger{}, // 日志系统
assembly.Database{}, // 数据库连接
assembly.Redis{}, // Redis连接
}
}
# 完整健康检查 GET /health # 简单健康检查 GET /health/simple
响应示例:
{
"code": 0,
"message": "操作成功",
"data": {
"status": "UP",
"timestamp": 1703123456,
"services": {
"database": {
"status": "UP"
},
"redis": {
"status": "UP"
}
}
}
}
GET /
# 服务配置
addr: ":8080"
mode: "debug" # debug, release
# 数据库配置
db:
driver: "postgresql" # postgresql, mysql
host: "127.0.0.1"
port: 5432
username: "test"
password: "123456"
dbname: "test"
# Redis配置
redis:
host: "127.0.0.1"
port: 6379
password: ""
db: 0
# 数据库迁移配置
database:
halt_on_migration_failure: true
gofmt 格式化代码项目使用统一的错误码和响应格式:
// 错误码定义
const (
ErrCodeSuccess = 0 // 成功
ErrCodeBadRequest = 400 // 请求参数错误
ErrCodeUnauthorized = 401 // 未授权
ErrCodeNotFound = 404 // 资源不存在
ErrCodeInternal = 500 // 内部服务器错误
)
// 统一响应格式
type Response struct {
Code int `json:"code"`
Message string `json:"message"`
Data interface{} `json:"data,omitempty"`
}
使用 DAO 层封装数据库操作:
// app/dao/user_dao.go
func GetUserByUsername(username string) (*model.User, error) {
var user model.User
if err := helper.Database().Where("username = ?", username).First(&user); err != nil {
return nil, err
}
return &user, nil
}
# 构建镜像
docker build -t go-web-app .
# 运行容器
docker run -d -p 8080:8080 go-web-app
# 启动服务(包含数据库和Redis)
docker-compose up -d
# 查看日志
docker-compose logs -f
# 停止服务
docker-compose down
# 编译
go build -o bin/go-web main.go
# 运行
./bin/go-web
项目支持 Makefile 快速操作:
# 启动开发服务器
make run
# 构建项目
make build
# 运行测试
make test
# 格式化代码
make fmt
# 静态检查
make vet
# 清理构建文件
make clean
GET /health - 检查数据库、Redis等所有依赖服务GET /health/simple - 仅检查服务是否启动项目使用 Zap 进行结构化日志记录:
// 记录结构化日志
helper.Logger().Info("用户创建成功",
zap.String("username", username),
zap.Int("userID", userID),
)
支持通过环境变量覆盖配置文件:
export DB_HOST=localhost
export DB_PORT=5432
export DB_USERNAME=myuser
export DB_PASSWORD=mypass
export DB_DBNAME=mydb
export REDIS_HOST=localhost
export REDIS_PORT=6379
A: 在 config/autoload/router.go 中添加路由配置,在 app/controller/ 中实现控制器。
A: 在 app/middleware/ 中实现中间件,然后在 config/autoload/middleware.go 中注册。
A: 项目启动时会自动执行 AutoMigrate(),根据 Model 定义创建或更新表结构。
A: 修改 config.yaml 中的 db.driver 配置,支持 postgresql 和 mysql。
详细的开发规范请参考:
git checkout -b feature/AmazingFeaturegit commit -m 'Add some AmazingFeature'git push origin feature/AmazingFeature本项目基于 MIT 许可证,详情请查看 LICENSE 文件。