发布于 2026-01-05 4 阅读
0

一种构建 Golang 应用程序的实用方法

一种构建 Golang 应用程序的实用方法

本文将介绍构建 Go 应用程序时常用的几种方法。Go 语言本身并没有官方的项目结构指南,因此本文提供的 Go 应用程序结构指南仅供参考。

Go 是一门非常棒的语言,它易于学习,并且提供了丰富的开箱即用工具。大多数 Go 语言初学者都有一个共同的问题:由于缺乏官方指南,他们很难弄清楚如何构建应用程序。构建 Go 应用程序的主要方法是从简单入手,但要留有足够的灵活性,以便日后扩展。

Go 项目文件的目录结构或组织方式没有严格的规定。这既不好,容易造成混乱;又好,因为开发者可以根据自己的喜好构建项目结构。

好的代码结构是指在整个项目中保持一致的结构。没有什么比打开代码库后​​发现一部分代码用一种方式编写,而另一部分代码用另一种方式编写更糟糕的了。尤其当你不是原作者,只是刚接触这个新代码库,完全不知道应该遵循哪种结构时,更是如此。好的代码结构必须易于理解和浏览,并且逻辑清晰。好的代码结构会让你的编程工作更轻松、更有趣。

Go 开发者通常会遵循一定的模式来组织项目中的文件和目录结构。他们之所以遵循这些模式,是因为它们对他们自己和其他开发者来说行之有效。我认为,组织应该对所有 Go 应用项目采用相同的结构,这样可以提高开发者的效率。

在 Go 语言中构建项目文件结构

组织 Go 项目的更好方法是将相关的 Go 代码文件放在项目主目录下的子目录中,以便项目的其他部分能够找到服务 API 并使用它。

将所有源文件放在同一目录下并不是一个好主意,因为这会导致代码文件杂乱无章,最终你会花费大量时间寻找正确的文件。大多数经验丰富的开发人员都知道这一点。

为了演示项目布局,我们将创建一个名为“go-layout”的演示项目。

这是示例项目类型的树状结构。下面我们将解释每个文件夹的功能:

去

/cmd

该文件夹将包含此项目的主要应用程序。cmd文件
夹 内可能包含多个应用程序,每个应用程序都应该有自己的文件夹,因此路径应为.cmd -> applicationNameFolder

每个应用程序的目录名称应与您想要拥有的可执行文件的名称匹配,例如cmd/myapp

重要的是,我们不要在应用程序目录中放置大量代码。如果您认为这些代码可以被其他项目导入和使用,那么最好将这些代码放在该pkg目录中。

通常的做法是编写一个小函数,从 ` and`目录main中导入并调用代码/internalpkg

请查看一些用 Golang 编写的成功项目。

例如:

/api

此文件夹可以包含 OpenAPI/Swagger 规范、JSON 模式文件和协议定义文件。
例如:

/建造

此文件夹可以包含与打包和持续集成文件相关的文件夹/文件,例如 Docker 和脚本。

请将您的 CI 配置和脚本放在该/build/ci目录中。

例如:

/configs

它可以有配置文件模板或默认配置。

/示例

您可以提供您的应用程序和/或公共库的示例。

例如:

/内部的

私有应用程序和库代码。这是您不希望其他人将其导入到他们的应用程序或库中的代码。请注意,这种布局模式由 Go 编译器强制执行。另请注意,您不仅限于顶层内部目录。您可以在项目树的任何级别拥有多个内部目录。

您可以选择为内部包添加一些额外的结构,以区分共享和非共享的内部代码。这不是必需的(尤其对于小型项目而言),但通过视觉提示来展示包的预期用途会很有帮助。

您的实际应用程序代码可以放在该/internal/app目录(例如,/internal/app/myapp)中,而这些应用程序共享的代码可以放在 /internal/pkg 目录(例如,/internal/pkg/myprivlib)中。

该文件夹/internal/pkg包含一些并非本应用程序特有的软件包。理论上,如果这些软件包具有实用价值,可以将其提取为一个独立的公共软件包。

例如:

/pkg

可供外部应用程序使用的库代码(例如/pkg/mypubliclib)。其他项目会导入这些库并期望它们能够正常工作,因此在在此处添加任何内容之前,请务必仔细检查。

请注意internal目录是确保您的私有包不可导入的更好方法,因为 Go 强制执行此操作。

/pkg如果你的应用项目非常小,额外的嵌套层级意义不大,那么不使用目录是可以的。但当项目规模变大,根目录变得拥挤时,你就需要考虑使用目录了。

例如:

/第三者

外部辅助工具、分支代码和其他第三方实用程序(例如 Swagger UI)。

/web

Web 应用程序特定组件:静态 Web 资源、服务器端模板和 SPA。

/http

您可能希望通过多种通信方式(例如 rest-api 和 grpc)公开您的应用程序。

/http/rest这样,您可以通过创建单独的目录(例如 `<directory>` 或`<directory>` )来将每种类型的通信层分开。/http/grpc

您可以从我的 GitHub 下载完整的项目布局模板(https://github.com/fir1/go-layout)。

结束

希望本教程能让你对如何构建下一个 Golang 应用程序有所启发。

这篇博客就到这里。欢迎在评论区留下您的看法。感谢您的阅读,希望对您有所帮助。

快乐学习和分享。

文章来源:https://dev.to/firdavs_kasymov/a-practical-approach-to-structuring-golang-applications-1cc2