本文首发地址:jianghushinian.cn/2023/02/25/…

Go 言语作为一门高效、简练、并发安全的言语,越来越受到开发者们的喜爱,特别是在 Web 开发及云原生范畴。而关于一个大型的 Go Web 项目而言,一个优异的目录结构规划是必不可少的。它可以协助咱们更好地安排代码、削减冗余、进步可保护性和可扩展性。在本文中,咱们将评论怎么规划一个优异的 Go Web 项目目录结构。

基本准则

在开始规划项目目录结构之前,咱们需求先了解一些规划目录的基本准则:

/docs/examples

Go 项目标准布局

前期的 Go 项目目录结构规划形形色色,由于大多数 Go 开发者都有其他编程言语根底,比方 Java、Python 等,这些开发者在规划 Go 项目时,目录结构往往会携带一些其他编程言语、框架所惯用的风格。

但许多情况下,直接套用其他编程言语风格的目录所规划出来的 Go 项目都会有许多不合理之处,为了改变现状,慢慢的 Go 言语社区诞生了许多更契合 Go 哲学的项目目录风格。而这其间,最著名的项目当属 golang-standards/project-layout。

golang-standards/project-layout

该项意图目录结构基于功能和约定进行安排,经过供给一种标准化的目录结构,可以使得不同的项目之间具有共同的代码安排方法,便于开发者了解和运用。

该项意图目录结构包括以下几个部分:

Go 应用程序相关目录

/cmd
main.gomain.go
cmd
├── ctl
│ └── main.go
├── server
│ └── main.go
└── task
    └── main.go

不要在这个目录中放太多的代码,更不要放事务逻辑代码,保持整齐。

/internal
internal
use of internal package xxx not allowed
xxxinternal
internal
/internal
internal
├── app
│ ├── ctl
│ ├── server
│ └── task
└── pkg
/internal/app/internal/pkg
/pkg

包括可导出的公共库,可以被其他项目引证。这意味着此目录下的代码可以被导入任何其他项目,被当作库程序来运用,所以将代码放到此目录前要慎重考虑,不要将私有代码放到此目录下。

pkginternal
/configs

此目录寄存装备文件模板或默许装备。

configs
/test

可以用来寄存 e2e 测试和测试数据等。

/test/data/test/testdata
._
deployments

用来寄存 IaaS、PaaS 体系和容器编列布置所需求的装备及模板(如:Docker-Compose,Kubernetes/Helm,Mesos,Terraform,Bosh)。

/deploy
/third_party
/third_party/fork
/web

假如你打算在项目目录下包括配套的前端程序代码,则可以寄存到此目录。首要包括静态资源、前端代码、路由等。

假如你的项目仅供给 RESTful API,且前后端程序需求分开独立保护,则可以不需求此目录,主张将前端代码作为一个独立的项目存在。

项目办理相关目录

/init

包括体系初始化(systemd、upstart、sysv)和进程办理(runit、supervisord)等装备。这在非容器化布置的项目中非常有用。

别的还可以包括初始化代码,如数据库搬迁、缓存初始化等。

/scripts

寄存用于履行各种构建、安装、分析等操作的脚本。

/Makefile
/build

寄存程序构建和持续集成相关的文件。例如:

/build/package
/build/ci
/tools
/pkg/internal
/assets

项目运用的其他资源 (Image、CSS、JavaScript、SQL 文件等)。

/githooks

Git 相关的钩子寄存目录。

项目文档相关目录

/api

当时项目对外露出的 API 文档,如 OpenAPI/Swagger 标准文档、JSON Schema 文件、ProtoBuf 界说文件等。

api
└── openapi
    └── openapi.yaml
/docs

规划、开发和用户文档等(除 godoc 生成的文档)。

/examples

应用程序或公共库的示例。降低运用者的上手难度。

不主张运用的目录

/src
/src
$GOPATH/src/src
$GOPATH/src/your_project/src/your_code.go
/src

一些放在项目根目录下的文件

/README.md
README.mdREADME.md
README.md
/Makefile
MakefileMakefile
/CHANGELOG

用于寄存项意图更新记录,如版本号、作者、更新内容等。假如嫌麻烦,还可以运用 git-chglog 或相似东西主动生成。

/CONTRIBUTING.md
/CONTRIBUTING.md
/LICENSE
/LICENSE

总结

经过上面的解说,终究咱们得到的项目目录结构如下:

project
├── CHANGELOG
├── CONTRIBUTING.md
├── LICENSE
├── Makefile
├── README.md
├── api
│ └── openapi
│     └── openapi.yaml
├── assets
├── build
├── cmd
│ ├── ctl
│ │ └── main.go
│ ├── server
│ │ └── main.go
│ └── task
│     └── main.go
├── configs
├── deployments
├── docs
├── examples
├── githooks
├── init
├── internal
│ ├── app
│ │ ├── ctl
│ │ ├── server
│ │ └── task
│ └── pkg
├── pkg
├── scripts
├── test
├── third_party
├── tools
└── web
golang-standards/project-layout

经过运用以上供给的项目目录结构,可以协助开发者更好地办理和安排自己的代码,进步代码的可保护性和可扩展性。

/cmd/internal/configs

别的,随着技能的不断迭代发展,如 DDD 正在流行起来,Go 社区对项目目录结构的探究也仍在持续,在可预见的未来,一个优异的 Go Web 项目目录结构的界说必定会被更新,等待下次可以分享更优异的目录结构规划。

P.S.

本文部分内容由 ChatGPT 生成,体会科技乐趣 :)。

参阅

github.com/golang-stan…
github.com/golang-stan…
github.com/danceyoung/…
travisjeffery.com/b/2019/11/i…