man*_*rie 5 design-patterns go
如您所知,在我看来,Go 是 OOP 的一种现代方法,具有一些出色的功能,例如强制您使用组合而不是继承。我只是想了解如何根据文件夹和包结构来设计编写良好的 Go 代码。
我只是想知道这种类似于 React 的方法(如下所示)是否可以工作?将应用程序作为组件划分到不同的包中?
或者您能给我一个关于 Web api 的文件夹/打包的良好结构的示例、链接和想法吗?Go 只是我的开源项目后台的一个 api,顺便说一句,在客户端我计划有一个单页 React 应用程序。
多谢,
Bij*_*jan 13
GitHub 上有一个拥有很多 star 的 Repo(截至撰写本文时有 22k)。这种方法实际上相当完整,但对于较小的项目来说可能有点过头了。
https://github.com/golang-standards/project-layout
| 文件夹 | 描述 |
|---|---|
| /命令 | 该项目的主要应用。 |
| /内部的 | 私有应用程序和库代码。 |
| /包 | 可供外部应用程序使用的库代码。 |
| /小贩 | 应用程序依赖项(手动管理或通过您最喜欢的依赖项管理工具(例如新的内置 Go Modules 功能)进行管理)。 |
| 文件夹 | 描述 |
|---|---|
| /api | OpenAPI/Swagger 规范、JSON 模式文件、协议定义文件。 |
| 文件夹 | 描述 |
|---|---|
| /网络 | Web 应用程序特定组件:静态 Web 资产、服务器端模板和 SPA。 |
| 文件夹 | 描述 |
|---|---|
| /配置 | 配置文件模板或默认配置。 |
| /在里面 | 系统 init(systemd、upstart、sysv)和进程管理器/主管(runit、supervisord)配置。 |
| /脚本 | 用于执行各种构建、安装、分析等操作的脚本。 |
| /建造 | 打包和持续集成。 |
| /部署 | IaaS、PaaS、系统和容器编排部署配置和模板。 |
| /测试 | 其他外部测试应用程序和测试数据。 |
| 文件夹 | 描述 |
|---|---|
| /文档 | 设计和用户文档(除了 godoc 生成的文档之外)。 |
| /工具 | 该项目的支持工具。 |
| /例子 | 您的应用程序和/或公共库的示例。 |
| /第三者 | 外部帮助工具、分叉代码和其他第 3 方实用程序(例如 Swagger UI)。 |
| /githooks | Git 挂钩。 |
| /资产 | 与您的存储库一起使用的其他资产(图像、徽标等)。 |
| /网站 | 如果您不使用 GitHub 页面,则可以在此处放置项目的网站数据。 |
我倾向于将我的应用程序构建为:
$GOPATH/github.com/yourname/projectname/
cmd/
app1/
main.go
app2/
main.go
db/
001_initial_schema.sql
002_add_timestamps.sql
... etc ...
lib/
lib1/
lib2/
html/
..all the html stuff..
其中 app1 / app2 是命令行应用程序。通常它只是一个应用程序(您的网络服务器)。
lib/* 就是您拥有的任何隔离的功能部分。
通常,我从 cmd/app1 开始,然后当项目变得足够复杂时扩展到 lib。
并创建你的静态文件服务器(假设你有一个),使用“html”作为目录。
对于数据库迁移,我使用我编写的一个非常简单的迁移器,因为我发现其他迁移器太复杂/太大。
这是我在项目中使用的代码。
我想过让它成为一个真正的库,但我很确定这是 postgresql 特定的,因为它假设 DDL 是事务性的。
使用这种结构,您可以简单地执行以下操作(从项目根目录):
go install ./... && app1
构建/测试您的应用程序。
如果您想部署到 Heroku,因为 Heroku 将工作目录设置为项目根目录,那么这种结构也自然会起作用。