如何设计一个优秀的 Go Web 项目目录结构

这篇具有很好参考价值的文章主要介绍了如何设计一个优秀的 Go Web 项目目录结构。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Go 语言作为一门高效、简洁、并发安全的语言,越来越受到开发者们的青睐,特别是在 Web 开发及云原生领域。而对于一个大型的 Go Web 项目而言,一个优秀的目录结构设计是必不可少的。它可以帮助我们更好地组织代码、减少冗余、提高可维护性和可扩展性。

在本文中,我们将讨论如何设计一个优秀的 Go Web 项目目录结构。

基本原则

在开始设计项目目录结构之前,我们需要先了解一些设计目录的基本原则:

  • 可读性和可维护性:设计目录结构应该易于阅读和维护,目录名称要简洁、清晰,最好能达到顾名思义的效果。

  • 可扩展性和模块化:设计目录结构应该易于扩展和模块化,随着时间的推移,项目会不断变大,项目的目录结构应该能够很容易支撑这种变化。

  • 规范性和一致性:设计目录结构应该遵循规范和一致性,如无特殊情况,目录名称最好统一使用单数形式(特殊情况可以打破,如 /docs、/examples)。

Go 项目标准布局

早期的 Go 项目目录结构设计五花八门,因为大多数 Go 开发者都有其他编程语言基础,比如 Java、Python 等,这些开发者在设计 Go 项目时,目录结构往往会携带一些其他编程语言、框架所惯用的风格。

但很多情况下,直接套用其他编程语言风格的目录所设计出来的 Go 项目都会有很多不合理之处,为了改变现状,慢慢的 Go 语言社区诞生了很多更符合 Go 哲学的项目目录风格。而这其中,最著名的项目当属 golang-standards/project-layout (https://github.com/golang-standards/project-layout )。

golang-standards/project-layout 是一个 Go 社区维护的 Go 项目目录结构标准,它的目标是提供一种一致性的、易于理解和使用的目录结构,从而帮助开发者更好地组织和管理自己的代码。

该项目的目录结构基于功能和约定进行组织,通过提供一种标准化的目录结构,可以使得不同的项目之间具有一致的代码组织方式,便于开发者理解和使用。

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

Go 应用程序相关目录

/cmd
这个目录主要负责程序的启动、初始化、停止等功能,故主要包含项目的入口文件 main.go,如果一个项目有多个组件,则可以存放多个组件的 main.go,例如:​​​​​​​
cmd├── ctl│   └── main.go├── server│   └── main.go└── task    └── main.go
不要在这个目录中放太多的代码,更不要放业务逻辑代码,保持整洁。
/internal
存放项目的内部私有代码和库,不允许在项目外部使用。同时这也是 Go 在编译时强制执行的校验规则,如果在其他项目中导入 internal 目录下的内容,Go(1.19) 在编译时会得到如下错误:
use of internal package xxx not allowed

注:xxx 为包含 internal 的包路径

在项目的目录树中的任意位置都可以有 internal 目录,而不仅仅是在顶级目录中。

在 /internal 内部可以增加额外的包结构来区分组件间共享和私有的内部代码:​​​​​​​

internal├── app│   ├── ctl│   ├── server│   └── task└── pkg
其中 /internal/app 下存放各个组件的逻辑代码,/internal/pkg 下存放各组件间的共享代码。
/pkg
包含可导出的公共库,可以被其他项目引用。这意味着此目录下的代码可以被导入任何其他项目,被当作库程序来使用,所以将代码放到此目录前要慎重考虑,不要将私有代码放到此目录下。
/configs
此目录存放配置文件模板或默认配置。
前文讲设计项目目录的基本原则时提到目录名最好使用单数形式,不过由于使用 configs 来存放配置已经是约定俗成的事实标准,故此目录名称可以打破这项设计原则。
/test
可以用来存放 e2e 测试和测试数据等。
对于较大的项目,有一个数据子目录更好一些。例如,如果需要 Go 在编译时忽略目录中的内容,则可以使用 /test/data 或 /test/testdata 这样的目录名称。
另外 Go 还会忽略以 . 或 _ 开头的目录或文件,因此可以更具灵活性的来命名测试数据目录。
deployments
用来存放 IaaS、PaaS 系统和容器编排部署所需要的配置及模板(如:Docker-Compose,Kubernetes/Helm,Mesos,Terraform,Bosh)。
如果你的项目作为 Kubernetes 生态中的一员或使用 Kubernetes 部署,则建议命名为 /deploy,更加符合 Kubernetes 社区风格。
/third_party
外部辅助工具目录,fork 的代码和其他第三方工具(例如 Swagger UI)。比如我们修改了某个开源的第三方项目的代码,使其满足当前项目的使用需求,
就可以将修改后的代码放到 /third_party/fork 目录下进行维护。
/web
如果你打算在项目目录下包含配套的前端程序代码,则可以存放到此目录。主要包括静态资源、前端代码、路由等。
如果你的项目仅提供 RESTful API,且前后端程序需要分开独立维护,则可以不需要此目录,建议将前端代码作为一个独立的项目存在。
项目管理相关目录
/init
包含系统初始化(systemd、upstart、sysv)和进程管理(runit、supervisord)等配置。这在非容器化部署的项目中非常有用。
另外还可以包含初始化代码,如数据库迁移、缓存初始化等。
/scripts
存放用于执行各种构建、安装、分析等操作的脚本。
根文件 /Makefile 可以引用这些脚本,使其变得更小、更易于维护。
/build
存放程序构建和持续集成相关的文件。例如:
使用 /build/package 目录来存放云(AMI),容器(Docker),操作系统(deb,rpm,pkg)软件包配置和脚本。
使用 /build/ci 目录来存放 CI(travis、circle、drone)配置文件和脚本。
/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
一些有 Java 或 Python 开发经验的开发者习惯在项目中设计一个 /src 目录,但在 Go 语言中这是不推荐的做法。
早期的 Go 语言的项目都会被放置到 $GOPATH/src 目录下,如果项目中再有一个 /src 目录,那么项目最终的存放的路径就显得比较奇怪:
$GOPATH/src/your_project/src/your_code.go
因此,请不要在一个 Go 项目中设计 /src 目录。
一些放在项目根目录下的文件
/README.md
README.md 是学习并使用项目的入口,是让用户了解项目的第一手资料。一个项目的 README.md 通常包含项目名称和简介、安装说明、使用说明、贡献方式、版权和许可等。
GitHub 也会默认解析 README.md 文件并渲染成 HTML 文档。
/Makefile
Makefile 是一个老牌的项目管理工具,建议在 Go 项目中都集成它。
/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 项目目录结构的定义一定会被更新。文章来源地址https://www.toymoban.com/news/detail-521256.html

到了这里,关于如何设计一个优秀的 Go Web 项目目录结构的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 初始化一个Gin框架的Go-Web项目

    使用到的第三方库 gin Gin 框架 viper 配置文件管理 cors 跨域资源请求配置 gorm ORM 库 zap 日志记录 Go 语言程序的入口点 main.go 文件 使用 flag 读取配置文件路径参数,默认当前目录下 使用 viper 读取 config.ini 配置文件初始化初始数据 初始化随机数种子 初始化数据库 声明启动程序

    2024年02月09日
    浏览(55)
  • Golang:Go语言结构

    在我们开始学习 Go 编程语言的基础构建模块前,让我们先来了解 Go 语言最简单程序的结构。 Go 语言的基础组成有以下几个部分: 包声明 引入包 函数 变量 语句 表达式 注释 接下来让我们来看下简单的代码,该代码输出了\\\"Hello World!\\\": 让我们来看下以上程序的各个部分: 第一

    2024年02月10日
    浏览(59)
  • 用go设计开发一个自己的轻量级登录库/框架吧(项目维护篇)

    本篇将开始讲讲开发库/框架的最开始阶段,也就是搭建一个项目 源码:weloe/token-go: a light login library (github.com) 项目结构,不是上一篇所说的代码架构,而是分包,明确的分包更有助于我们的开发。本框架分包如下 我们选择使用GitHub进行代码托管,同时也使用GitHub Actions进行

    2024年02月03日
    浏览(51)
  • 如何打造优秀Web3产品

    近日,我们采访了Mysten Labs的联合创始人兼首席执行官Evan Cheng,探讨了Web3技术对消费者的价值、Web3行业应该如何更好地自我诠释,以及它对产品开发的影响。 您曾谈到Web3作为一种所有权实验,这种新技术可能会改变消费者的行为。能展开说明一下这个观点吗? 这个问题可

    2024年02月09日
    浏览(48)
  • 初级 - 如何搭建一个Java Web项目 - 记录

    Intellij IDEA 一般可以通过两种方式创建 Spring Boot 项目: 使用 Maven 创建 使用 Spring Initializr 创建 Tips: 标题选项后的 感叹号 ! 的是重点配置 这里笔者选择的是 2.x 版本的 Spring Boot,不勾选 Download pre-built … 1. 取消download pre-built shared indexes自动下载 Developer Tools 选项 ! 1. Spring

    2024年02月07日
    浏览(49)
  • 深入理解SSO原理,项目实践使用一个优秀开源单点登录项目(附源码)

    深入理解SSO原理,项目实践使用一个优秀开源单点登录项目(附源码)。 一、简介 单点登录(Single Sign On),简称为 SSO。 它的解释是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。 ❝ 所谓一次登录,处处登录。同样一处退出,处处退出。 ❞

    2024年02月11日
    浏览(45)
  • Go For Web:Golang http 包详解(源码剖析)

    本文作为解决如何通过 Golang 来编写 Web 应用这个问题的前瞻,对 Golang 中的 Web 基础部分进行一个简单的介绍。目前 Go 拥有成熟的 Http 处理包,所以我们去编写一个做任何事情的动态 Web 程序应该是很轻松的,接下来我们就去学习了解一些关于 Web 的相关基础,了解一些概念,

    2023年04月14日
    浏览(35)
  • 【GoLang入门教程】Go语言工程结构详述

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站:人工智能 前言 当创建一个Go语言项目时,良好的工程结构是确保项目可维护性、可扩展性和清晰性的关键。 虽然Go本身没有强制性的项目结构要求,但是采用一致性

    2024年01月24日
    浏览(80)
  • golang第七卷---go中的数据结构

    分享一个go语言高级编程学习网站:Go语言高级编程 数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成。 因为数组的长度是固定的,所以在Go语言中很少直接使用数组。 Go语言数组的声明: 数组是定长的,不可更改,在编译阶段就决定了

    2024年02月03日
    浏览(57)
  • 【职场解惑】如何做一个优秀的软件工程师

      在竞争激烈的职场上,各种职场难题时常出现,如何进行有效沟通、如何应对工作压力、如何提升职业能力等,这都是需要去克服的问题。一起来分享一下你的经验吧! “工程师是科学家;工程师是艺术家;工程师也是思想家。” 工程师是利用自然科学来创造工程的人。

    2024年02月06日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包