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

简介: 构建 Golang 应用程序的实用方法

本文将描述用于构建 Golang 应用程序的常见方法。Golang 没有一个官方的项目结构指南,所以它是一个有观点的 Go 应用结构指南。

Go 是一门神奇的语言,它简单易学,开箱即用,给你提供了很多工具。大多数开始学习 Golang 的 Gophers 都有一个共同点,由于缺乏官方指南,他们很难弄清楚如何构造应用程序。构造 Golang 应用程序的主要方法是开始时要简单,但要有发展的灵活性。

对于目录结构或如何以特定方式组织 Go 项目文件,没有严格的规则。这很糟糕,因为它很容易造成混乱,也很好,因为项目的结构可以根据开发者的口味来构建。

好的结构是在整个项目中保持一致。没有什么比来到代码库,看到一部分代码以一种方式完成,另一部分以另一种方式完成更糟糕的了。特别是当你不是原作者,而你刚刚来到新的代码库,你不知道你应该遵循哪种结构。好的代码结构必须是容易理解和浏览的,而且应该是有意义的。好的代码结构将使你作为一个程序员的生活变得轻松和有趣。

Go 开发人员通常遵循某些模式来布置他们项目中的文件和目录。他们通常遵循这些模式,因为这对他们和他们的同伴来说是可行的。在我看来,组织应该为他们所有的 Golang 应用项目遵循相同的结构,因为这样可以使开发人员更有生产力。

在 Go 中构建项目文件的结构

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

把所有的源文件放在同一个目录下并不是一个好主意,因为它使代码文件变得杂乱无章,结果是你要花大部分时间去寻找正确的文件。大多数有经验的开发者都知道这一点。

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

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

/cmd

该文件夹将包含这个项目的主要应用程序。

cmd 文件夹中可能有不止一个应用程序,每个应用程序都应该有自己的文件夹,所以路径是 cmd -> applicationNameFolder。

每个应用程序的目录名称应与你想拥有的可执行文件的名称一致,例如,cmd/myapp。

重要的是,我们不要把大量的代码放在应用程序目录中。如果你认为这些代码可以被导入并用于其他项目,最好将这些代码放在 pkg 目录中。

通常的做法是有一个小的主函数来导入和调用 /internal 和 pkg 目录下的代码。

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

例子:

/api

这个文件夹可以有 OpenAPI/Swagger 规格、JSON模式文件和协议定义文件。

例子:

https://github.com/moby/moby/tree/master/api

/build

这个文件夹可以有与打包和持续集成文件相关的文件夹或文件,如 Docker 和脚本。

把你的 CI 配置和脚本放在 /build/ci 目录中。

例子:

https://github.com/cockroachdb/cockroach/tree/master/build

/configs

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

/examples

你可以放置你的 应用或公共类库的例子。

例子:

/internal

私人应用程序和库的代码。这是你不想让别人导入他们的应用程序或库中的代码。请注意,这种布局模式是由 Go 编译器本身强制执行的。请注意,你并不局限于顶级的内部目录。你可以在你的项目树的任何一级有一个以上的内部目录。

你可以选择给你的内部包添加一些额外的结构,以分离你的共享和非共享的内部代码。这不是必须的(特别是对于较小的项目),但有视觉线索显示预期的包的用途是不错的。

你的实际应用代码可以放在 /internal/app 目录下(例如,/internal/app/myapp),而那些应用共享的代码放在 /internal/pkg 目录下(例如,/internal/pkg/myprivlib)。

文件夹 /internal/pkg 包含了不特定于此应用程序的包。如果这些包能提供实用性,理论上可以提取到一个独立的公共包中。

例子:

/pkg

可以被外部应用程序使用的库代码(例如:/pkg/mypubliclib)。其他项目会导入这些库,期望它们能够工作,所以在你把东西放在这里之前要仔细检查。

请注意,内部目录是确保你的私有包不能被导入的更好方法,因为它是由 Go 强制执行的。

如果你的应用项目非常小,而且额外的嵌套并没有增加多少价值,不使用 /pkg 目录是可以的。但当你的项目越来越大,你的根目录变得繁忙时,你就需要考虑这个问题了。

例子:

/third_party

外部辅助工具、分叉代码和其他第三方工具(例如,Swagger UI)。

/net

网络应用程序专用组件:静态网络资产、服务器端模板和SPA。

/http

你可能想通过几种通信手段暴露你的应用程序,如 rest-api 和 grpc。

这样你就可以通过创建一个单独的目录,如 /http/rest 或 /http/grpc,将每种类型的通信层单独分开。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
6月前
|
传感器 监控 物联网
golang开源的可嵌入应用程序高性能的MQTT服务
golang开源的可嵌入应用程序高性能的MQTT服务
333 3
|
JSON 缓存 Go
Golang 语言 Web 框架 beego v2 之控制器方法和输入输出数据
Golang 语言 Web 框架 beego v2 之控制器方法和输入输出数据
108 0
|
2月前
|
Go
Golang的math包常用方法
这篇文章介绍了Golang的math包中的常量和常用方法,并通过示例代码展示了如何使用这些常量和方法。
179 87
Golang的math包常用方法
|
5月前
|
负载均衡 监控 Go
使用Golang框架构建分布式系统
本文探讨了使用Golang构建分布式系统的方法。Golang因其高效、简洁的语法和并发支持成为理想的开发语言。文中列举了几个常用的Golang框架,如Echo、Gin、gRPC和NATS等,并强调了服务拆分、通信机制、负载均衡等构建分布式系统的关键要素。通过选择合适的框架,遵循需求分析、技术选型、服务设计等步骤,开发者可以构建出高性能、高可用和可扩展的系统。此外,文中还提供了一个使用gRPC和etcd的简单代码案例来说明实现过程。
268 4
|
6月前
|
网络协议 Go 数据安全/隐私保护
golang开源的可嵌入应用程序高性能的MQTT服务
golang开源的可嵌入应用程序高性能的MQTT服务
428 2
|
3月前
|
存储 设计模式 前端开发
|
3月前
|
存储 测试技术 Go
Golang 包:构建模块化代码的基石
【8月更文挑战第31天】
46 0
|
3月前
|
存储 安全 Go
|
6月前
|
存储 测试技术 Go
Golang框架实战-KisFlow流式计算框架(2)-项目构建/基础模块-(上)
KisFlow项目源码位于<https://github.com/aceld/kis-flow,初始阶段涉及项目构建和基础模块定义。首先在GitHub创建仓库,克隆到本地。项目目录包括`common/`, `example/`, `function/`, `conn/`, `config/`, `flow/`, 和 `kis/`。`go.mod`用于包管理,`KisLogger`接口定义了日志功能,提供不同级别的日志方法。默认日志对象`kisDefaultLogger`打印到标准输出。
666 7
Golang框架实战-KisFlow流式计算框架(2)-项目构建/基础模块-(上)
|
6月前
|
中间件 Go API
Golang深入浅出之-Go语言标准库net/http:构建Web服务器
【4月更文挑战第25天】Go语言的`net/http`包是构建高性能Web服务器的核心,提供创建服务器和发起请求的功能。本文讨论了使用中的常见问题和解决方案,包括:使用第三方路由库改进路由设计、引入中间件处理通用逻辑、设置合适的超时和连接管理以防止资源泄露。通过基础服务器和中间件的代码示例,展示了如何有效运用`net/http`包。掌握这些最佳实践,有助于开发出高效、易维护的Web服务。
86 1