Golang 依赖注入(Dependency Injection)
Dependency Injection 🧪
依赖注入是目前很多优秀框架都在使用的一个设计模式。
Dependency Injection 常常简称为:DI。它是实现控制反转(Inversion of Control – IoC)的一个模式。
在各种大工程中少不了各种测试,其中 TDD 就是非常流行的一种,在前端开发中用的比较多的 Jest 就是一种,在 Golang 开发命令行工具的时候也是需要 DI 这种模式来实现命令行测试的。因为传统的测试室获取不到命令行的输入输出的。
工程意图
仓库:https://github.com/guzhongren/TDD/tree/master/10.dependency-injection
编写一个命令行工具库,打包并运行程序,根据工具名称后面的名称来显示 'Hello, + 名称'
。
简化程序
我们知道 golang 打包后就是一个可执行程序,程序名称根据你指定的名称显示,那么要实现这个工具就是需要接收到程序名后面的参数并显示出来。但本次的重点是实现 DI, 所以我们将重点放在命令行的测试与实现上。
我们只实现 Greet 函数的 DI 就可以了。
初始化工程
go mod init dependency-injection
按照惯例,测试的函数需要以 Test 开头,参数为 *testing.T 类型
Test
- 测试先行
func TestGreet(t *testing.T) { // 申明 buffer,准备接受数据, 因为bytes.Buffer, 重点:bytes.Buffer实现了 io.Writer buffer := bytes.Buffer{} // 将buffer 传入,此时就是依赖注入的入口, Greet(&buffer, "chris") // 获取程序运行的结果 got := buffer.String() // 期望值 want := "Hello, chris" // 测试判断 if got != want { t.Errorf(`got %s, want %s`, got, want) } }
- 运行 go test, 程序会报错,因为没有实现 Greet 函数。
- 最小化的实现 Repeat
// Greet 打印问候 func Greet(w io.Writer, name string) { fmt.Fprintf(w, "Hello, "+name) }
重点说明,命令行的测试需要将结果打印在命令行窗口中,如果没有测试,我们可以用 fmt.Printf 等打印函数将结果打印出来,但是,
测试需要拿到打印的内容,就需要将内容用标准输出;当然可以变相的先用其他打印函数将结果打印出来,然后再将结果 return 出去,
在测试中,接受返回值,再比较;这样做不标准而已,学了今天内容其实就可以用 DI 来解决了。
运行测试
- 基本测试
$ go test PASS ok dependency-injection 0.006s
总结
基本测试很简单,不用解读了。作为开发者,我们应该用最直接的工具来保证我们程序的健壮性,而不一定要绕个弯来解决问题,如上面的打印结果的测试。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
在 React 中使用 Shadow DOM
1. Shadow DOM 是什么 Shadow DOM 是什么?我们先来打开 Chrome 的 DevTool,并在 'Settings -> Preferences -> Elements' 中把 ' Show user agent shadow DOM' 打上勾。然后,打开一个支持 HTML5 播放的视频网站。比如 Youtube: 可以看到 video内部有一个 #shadow-root,在 ShadowRoot 之下还能看到 div这样的普通 HTML 标签。我们能知道 video会有「播放/暂停按钮、进度条、视频时间显示、音量控制」等控件,那其实,就是由ShadowRoot 中的这些子元素构成的。而我们最常用的 input其实也附加了 Shadow DOM,比如,我们在 Chrome 中尝试给一个
- 下一篇
javascript教程:实现函数柯里化与反柯里化
下面来一起看看究竟什么是函数柯里化 维基百科的解释是:把接收多个参数的函数变换成接收一个单一参数(最初函数的第一个参数)的函数,并返回接受剩余的参数而且返回结果的新函数的技术。其由数学家Haskell Brooks Curry提出,并以curry命名。 概念往往都是干涩且难懂的,让我们用人话来解释就是:如果我们不确定这个函数有多少个参数,我们可以先给它传入一个参数,然后通过JS闭包来进行返回一个函数,内部函数接收除开第一个参数外的其余参数进行操作并输出,这个就是函数的柯里化; 举个小例子: 场景(需求): 众所周知程序员每天加班的时间还是比较多的,如果我们需要计算一个程序员每天的加班时间,那么我们的第一反应应该是这样; var overtime=0;function time(x){ return overtime+=x;}time(1); //1time(2); //3time(3); //6 上面的代码固然没有问题,可是需要每天调用都算加一下当天的时间,很麻烦,并且每调用一次函数都要进行一定的操作,如果数据量巨大,有可能会有影响性能的风险,那么有没有可以偷懒又能解决问题的办法呢?有...
相关文章
文章评论
共有0条评论来说两句吧...