参考:https://github.com/golang-standards/project-layout
/cmd
本项目的主干。
每个应用程序的目录名应该与你想要的可执行文件的名称相匹配,例如:
- cmd/
- app1/
- main.go
- app2/
- main.go
- app1/
/internal
这个包存放本项目的包,注意放在这里的包不能被其他项目import,在build其中,go的编译器会做强制校验(1.4加入的特性),例如:
- internal/
- app1/
- routes/
- controllers/
- services/
- models/
- dtos/
- app2/
- pkg/ 这里存放app1与app2公用的包,例如response结构体,自定义的error,中间键等
- app1/
/pkg
如果你把代码包放在根目录的pkg
下,其他项目是可以直接导入pkg
下的代码包的,即这里的代码包是开放的。一般项目不会使用到,但考虑到项目不确定性,项目初始化时,最好带上这个目录
/vendor
应用程序依赖项,执行go mod vendor 会自动生成该目录,并导入项目依赖
注意在go mod模式下,不会引入vendor下的包(导包爆红,使用 go mod tidy)
/web
前后端没分离的项目才会使用,存放前端资源
/configs
项目配置文件,例如:
- configs/
- app1/
- app1.toml
- app2/
- app2.yaml
- app1/
/docs
设计文档,使用文档等
- docs/
- app1/
- app2
/logs
日志目录,一般情况下,该目录下的所有内容会设置为ignore,不提交到代码仓库。开发人员做测试才会使用
/test
额外的外部测试应用程序和测试数据。你可以随时根据需求构造 /test
目录。通常可以用来做demo测试,除非与项目本身完整性有直接关系,该目录下所有内容可以设置为ignore,不提交到代码仓库。
go.mod
使用go moudle做管理,执行go mod init时,自动生成
go.sum
使用go moudle做管理,执行go mod vendor或其他有pull性质命令时会自动生成
面向包的设计
- 细化包目录
- import包的最后一层,要非常明确包的主要功能
例如:
- internal/
- app1/
- controllers/
- UserController.go
- AdminController.go
- controllers/
- app1/
应改为:
- internal/
- app1/
- controllers/
- usercontroller/
- user.go
- admincontroller/
- admin.go
- usercontroller/
- controllers/
- app1/