参考自golang-standards/project-layout

随着项目越来越复杂,开发人员越来越多,对于代码结构的要求也就越来越高了,如果项目结构不合理的话,维护起来也不方便,而且多人协调开发的难度也会加大,所以我想要规划一个完整的Go语言项目应该是什么样的结构,一开始我是参考kubernetes的项目结构,他们是以Cobra为基础来构建的整个项目,包结构非常复杂,我看起来确实有点困难,所以找到了这个项目,而且k8s跟它的结构基本一致,所以就以这个项目作为学习的例子


根目录

  • README.md

用来描述项目本身的文件,如何编译,如何运行等

  • Makefile

用来调用/scripts中的脚本,完成编译,测试,打包等其他的操作

Go Directories

在存放源码的任何目录中,都应该有一个和包名保持一致的.go文件,这个文件用来作为这个包的入口文件,正确的阅读代码,也应该是从这个文件开始 这个地方可以写一些与包初始化相关的代码

/cmd

程序的入口,所有的main函数应该都在这里

  • 目录的名字应该与可执行文件的名字相同
  • 不要在这个目录中写太多的代码
  • 如果你发现在这个目录中的代码有可能被其他地方引用,那么这些代码应该被移到/pkg目录中
  • 如果你这里的代码不希望被其他人引用,那么代码应该放到/internal目录中
  • 明确你的意图,不要让别人误解

/internal

私有的applicationlibrary代码,这里的代码都是你不希望被别人引用的

  • 将你的application代码放到/internal/app
  • 将你的library代码放到/internal/pkg

/pkg

library代码,这里的都应该是可以被外部的applications引用的

  • 其他的项目可能会引入这里的代码,所以将代码放入之前要思考一下

/vendor

存放依赖,可以使用自己喜欢的依赖管理工具,目前我使用的是glide

Common Application Directories

/configs

配置文件的模板,或者是默认的配置文件

/init

系统初始化(systemd,upstart,sysv)或者其他进程管理工具的配置

/scripts

编译,安装,解析等各种脚本,它的目的是让根目录的Makefile保持简单

/build

打包,持续集成

  • 将云,容器,操作系统打包的配置和脚本放到/build/package目录中
  • 将ci配置,脚本放到/build/ci目录中

/deployments

IaaS,PaaS,系统和容器的编排配置及模板(例如docker-compose,kubernetes)

/test

额外的测试需要的app以及测试数据,可以分为/test/data等,这个目录也可以被ignore

Service Application Directories

/api

用来存放 OpenAPI/Swagger 的接口描述文件,或者其他协议的接口描述文件

Web Application Directories

/web

web程序需要的组件,一般是静态文件和模板文件

Other Directories

/docs

设计及用户的文档,除了godoc生成以外的文档

/tools

这个项目用到的工具,这里也可以引用/pkg/internal中的代码

/examples

你的app的使用用例,或者是公开代码的调用方式

/third_party

外部的帮助工具,fork的代码,第三方的工具

/githooks

Git hooks

/assets

需要使用的其他的资源

不应该存在的目录

/src

这种一般是存在于Java项目中的,Go语言并不需要


Web应用层的结构目录

app

这个目录应该作为应用的根目录,作为启动这个应用的初始化代码,这个包的代码应该是直接提供给cmd目录里main包来直接调用启动的

其余的目录都应该存放在app

model

这个目录应该定义所有的结构体,包括数据库,http接口的请求响应,还有与字段相关的常量等,因为放在一个包里面容易组合,而且不会发生循环依赖,其他包都会引用这个 包,所以这个包是不引用其他任何包的,只用来单纯存放结构体,有关系的结构体可以放在一个文件中,方便查看

api

这个目录下的每一个目录都应该是接口层的实体以及接口定义,例如http,grpc

repositry / database

这个目录下的应该都是存储层的实体以及接口定义,具体的接口实现可以放到子目录中,例如mysql,redis

server

这个目录下的每一个目录应该都是提供给外部调用的,例如http,thrift,grpc等,这里应该存放的是初始化这些server的代码

service / handler

这个目录下应该是实现了server中定义的所有服务的接口,这里存放的应该都是逻辑代码

这是目前的理解,未完待续…