千家信息网

Go包内的组成是怎样的

发表于:2024-11-12 作者:千家信息网编辑
千家信息网最后更新 2024年11月12日,本篇内容介绍了"Go包内的组成是怎样的"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!包及其依赖在开发
千家信息网最后更新 2024年11月12日Go包内的组成是怎样的

本篇内容介绍了"Go包内的组成是怎样的"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

包及其依赖

在开发微服务时,按组件拆分服务很有用。每个组件都应该是独立的,理论上,如果需要,可以将其提取到外部服务。如何理解和实现呢?

假设我们有一个服务,它处理与订单相关的所有事情,比如发送电子邮件的确认、将信息保存到数据库、连接到支付提供商等。每个包都应该有一个名称,该名称清楚地说明了它的用途,并且遵守命名标准。

这只是我们有 3 个包的项目的一个例子:confemailspayproviderswarehouse。包名应尽量简短并能让人一目了然。

每个包都有自己的 Setup()函数。该函数只接收能让该包运行的最基本的参数。例如,如果包对外提供 HTTP 服务,那么 Setup() 函数则仅需要接受一个类似 mux route 的 HTTP route。当包需要访问数据库时,Setup() 函数也是只接受 sql.DB 参数就可以了。当然,这个包也可能需要依赖另一个包。

包内的组成

知道了模块的外部依赖,下一步我们就可以专注于如何在模块内组织代码(包括相关依赖的处理)。在最开始,这个包包含以下文件: setup.go - 其中包含 Setup()函数, service.go - 它是逻辑文件, repository.go - 它是在读取/保存数据到数据的的文件。

Setup()函数负责构建模块的每个构建块,即服务、存储库、注册事件处理程序或 HTTP 处理程序等等。这是使用这种方法的实际生产代码的一个例子。

func Setup(router *mux.Router, httpClient httpGetter, auth jwtmiddleware.Authorization, logger logger) {
h := httpHandler{
logger: logger,
requestClaims: jwtutil.NewHTTPRequestClaims(client),
service: service{client: httpClient},
}
auth.CreateRoute("/v1/lastAnswerTime", h.proxyRequest, http.MethodGet)
}

以上代码中,它构建了 JWT 中间件,这是一个处理所有业务逻辑(以及日志的位置)并注册 HTTP 处理程序的服务。正因为如此,模块是非常独立的,并且(理论上)可以转移到单独的微服务中,而不需要做太多工作。最后,所有的包都在 main 函数中配置。

有时,我们需要一些处理程序或数据库驱动。例如,一些信息可以被存储在数据库中,然后通过事件发送到平台的不同部分。使用像 saveToDb()这样的方法将数据只保存在同一个库中是很不方便的。所有类似的元素都应该由以下功能分割:repository_order.go 或 service_user.go。如果对象的类型超过 3 种,则将其移动到单独的子文件夹中。

测试

说到测试,我坚持一些原则。首先,在 Setup()函数中使用接口。这些接口应该尽可能小。在上面的例子中,有一个 httpGetter 接口。接口中只有Get()函数。

type httpGetter interface {
Get(url string) (resp *http.Response, err error)
}

谢天谢地,我只需要模拟一个方法。接口的定义需要尽可能地接近它的用途。

其次,尝试编写更少的测试用例的同时可以覆盖到更多的代码。对于每个主函数的决策/操作,一个成功的测试用例和一个失败的测试用例应该足够覆盖大约 80% 的代码。有时,程序中有一些关键部分,这部分可以被单独的测试用例覆盖。

最后,在以 _test 为后缀的单独包中编写测试,并将其放入模块中。把所有的东西都放在一个地方是很有用的。

当您想要测试整个应用程序时,请在主函数旁边的setup()函数中准备好每个依赖项。它将为生产环境和测试环境提供相同的设置,可以为您避免一些 bug。测试应该重用 setup()函数,并且只模拟那些不易模拟的依赖项(比如外部 api)。

"Go包内的组成是怎样的"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

函数 测试 数据 处理 服务 程序 代码 接口 模块 数据库 文件 例子 方法 更多 事件 信息 内容 参数 名称 实际 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 乱世王者 服务器爆满 一台服务器一年电费 数据库系统概论最新版出版时间 西宁网络技术销售价格 软件开发工程师福利待遇 网络技术暴利 服务器检车 开博尔高清播放器的电脑服务器 公安部网络安全局副局 上海银行软件开发中心总经理 网络安全管理人员制度 wincc数据库安装教程 数据库的结构被划分为哪三个层次 方舟生存进化开服务器攻略 全国中小学生学习网络安全 您最信赖的网络安全品牌是 在数据库中如何批量插入数据 自建win2003代理服务器 阳信桃源网络技术有限公司 网络安全素质教育多少分及格 企业的网络安全论文 九悦软件开发公司电话 学习软件开发多少分能上 德温特专利数据库一年费用 如何开ftp服务器 提示dns服务器设置有问题 上海银行软件开发中心总经理 mc部落服务器有什么模组 嵌入式软件开发 技能树 工作中的我严守网络安全红线
0