现有的组织结构
现在使用的 golang gin 的代码组织结构是延续了之前使用 php laravel 的组织方式, 主要目录包括:
- models
- controllers
- views / templates
- public
每个目录下都是一堆堆的 go 文件,例如 controllers 下是 user.go, article.go 等。
现有结构的弊端
现有组织结构用了快两年,经历的 gin 项目多了之后,弊端就逐渐显露了出来。例如:
- 所有 controllers 都在一个 package 内,就算是我一个人开发、维护,都很容易出现全局变量重名的情况。不得已就得加前缀,但是这样就增加了编码负担
- 新项目要复制旧项目的代码结构,做删减时,不方便,既要删除 models 中的,还要删 controllers,还要删 router 中的路由
参考 python django 框架的做法
里面一堆 app 目录,每个 package 包含一个子功能的所有代码,即将 model controller route 都放在一个目录下。
找到一个采用这种结构的 github 项目:
https://github.com/gothinkster/golang-gin-realworld-example-app概要目录结构:
> tree
.
├── articles
│ ├── doc.go
│ ├── models.go
│ ├── routers.go
│ ├── serializers.go
│ └── validators.go
├── common
│ ├── database.go
│ ├── unit_test.go
│ └── utils.go
├── doc.go
├── hello.go
├── scripts
│ ├── coverage.sh
│ └── gofmt.sh
└── users
├── doc.go
├── middlewares.go
├── models.go
├── routers.go
├── serializers.go
├── unit_test.go
└── validators.go
可以看到里面 users 跟 articles 就是两个独立的 package,类似 django 里 app 的概念。
唯一出乎意料的是这个 demo 里,route 和 controller 逻辑都写在了 routers.go 中。
实际上,我感觉把路由和接口函数都写在 controller.go 里完全可以接受,没有必要再单独搞一个 routers.go 文件。 就好像 spring boot 中在函数前面加注解实现路由一样,放在一块也挺清晰。
渐进式改造
先保持现有的组织结构,在加新功能时,使用新的结构。担心改动太多影响目前工期。