阅读 212

Golang gin 项目骨架

项目地址

gin 项目骨架,代码结构清晰,层次分明,适合作为模板

ORM使用gorm 日志使用logrus

项目结构

.
├── server.go #项目启动文件
├── build.sh # 构建脚本
├── conf #多环境的配置文件
│  └── config.dev.yml
|  └── config.online.yml
├── dal #数据库交互层
│  ├── option.go
│  └── user
│       └── user.go
├── domain #包括数据库实体和HTTP请求实体,返回实体,常量,枚举
│   ├── consts
│      └── consts.go
│   ├── entity.go
│   ├── enums
│   ├── req.go
│   ├── resp.go
│   └── user.go
├── handler #路由处理层
│   ├── ping.go
│   ├── result
│   │   └── result.go
│   └── user
│       └── user.go
├── router #路由处理函数
│   ├── middleware
│   │   ├── context.go
│   │   └── latency.go
│   └── router.go
├── script
│   └── bootstrap.sh
└── util  #全局使用到的一些变量和函数
    ├── config.go
    ├── logger.go
    └── mysql.go
复制代码

对于分层的处理

golang使用包来组织源码,有多种代码结构分层的方式 以handler调用dao来说

  1. 不区分实体
项目结构就会变成类似 
dal/user.go
dal/xx.go
创建就需要用
func CreateUser
func CreateXXX
需要在函数签名上区分实体
复制代码
  1. 区分实体,在同个包下,使用空结构体区分
同样是1的结构
dal/user.go
dal/xx.go
可以在每个实体定义空结构体实现命名空间不同
dal/user.go 内容
type UserDao struct {}
func (d UserDao) Create()
这样可以不用在函数签名上区分操作的实体
上层调用
var userDao UserDao
userDao.Create 
复制代码
  1. 区分实体,使用包别名方式
包结构
dal/user/create.go
func Create()

上层调用
import userdao "path/dal/user"
userdao.Create()
复制代码

1,2,3各有优缺,应根据项目规模选择