因为笔者一开始是在精弘暑期课入门的go,因此主要学习的还是部门项目微精弘的代码目录结构,所以对go的标准目录结构不是很了解,特此出一篇文章来捋一下go现在比较规范的目录结构,以此来学习。
目录规范
虽然每个项目的目录结构并不是有规定模板的,也有很多优秀的项目并不是常规的项目布局,还是要依据项目类型、大小及灵活程度做调整,但一定要保证结构清晰!
一般要求:
- 命名清晰:目录命名要清晰、简介,不宜过长或过短。目录名要求能清晰表达出该目录所要实现的功能,在清晰表达的基础上最好用单数,避免单复混用的情况。
- 功能明确:一个目录所要实现的功能应该是明确的、并且在整个项目目录中具有高辨识度。
- 全面性:目录结构应该尽可能全面地包含研发过程中需要的功能,例如文档、脚本、源码管理、API 实现、工具包、第三方包、测试、编译产物等。
- 可预测性:项目规模一般是从小到大的,所以一个好的目录结构应该能够在项目变大时,仍然保持之前的目录结构。
- 可扩展性:每个目录下存放了同类的功能,在项目变大时,这些目录应该可以存放更多同类功能
目录类型
根据项目的功能,目录结构可以分为两种:
平铺式目录结构
当一个项目是体量较小或是一个工具库时,适合使用平铺式目录结构。项目的代码都存放在项目的根目录下,可以减少项目引用路径的长度。例如 github.com/golang/glog:
结构化目录结构
当前 Go 社区比较推荐的结构化目录结构是 project-layout 。虽然它并不是官方和社区的规范,但因为组织方式比较合理,被很多 Go 开发人员接受并推荐,因此我现在先以这个作为规范。
微精弘目录架构
在讲这个新的目录结构前,我先来聊聊wjh的目录结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| ├── app │ ├── apiException │ ├── config │ ├── controllers │ ├── midwares │ ├── models │ ├── services │ └── utils ├── config │ ├── api │ ├── config │ ├── database │ ├── router │ ├── redis │ ├── session │ └── wechat ├── dockerfile ├── docker-compose.yml ├── go.mod ├── go.sum ├── main.go ├── Makefile
|
yysy,这个目录结构还是比较简单且清晰的,易于新手理解
project-layout目录架构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| project-layout/ ├── api ├── cmd ├── chart ├── conf ├── docs │ ├── dev │ │ ├── en-US │ │ └── zh-CN │ ├── guide │ │ ├── en-US │ │ └── zh-CN │ └── README.md ├── examples ├── go.mod ├── go.sum ├── hack │ ├── include │ ├── scripts │ └── docker ├── internal │ ├── app │ │ └── server.go │ ├── global │ │ └── config │ ├── http │ │ ├── router │ │ ├── middleware │ │ ├── dao │ │ ├── controllers │ │ └── services │ ├── models │ │ ├── user.go │ │ └── ... │ └── pkg │ ├── code.go │ ├── utils │ ├── log │ ├── database │ ├── session │ └── redis ├── logs ├── LICENSE ├── Makefile ├── pkg │ └── util ├── README.md ├── vendor ├── deployments ├── test │ ├── testdata │ └── e2e ├── web ├── public └── .gitignore
|
经过多方参考,最终形成这样的一个目录,好的目录结构,总能让人眼前一亮,舒舒服服的看下去。项目的目录结构并没有一个强制性规范,我们应该不断看优秀的项目的结构目录,不断优化自己的架构意识,使得自己项目的扩展性加大的同时还能保证清晰。加油(ง •_•)ง