Golang 入门资料+笔记

learn go with tests 学习笔记(四)依赖注入

2020-06-08  本文已影响0人  半亩房顶

知识点

依赖注入举例

首先我们应该明白什么是控制反转 -> 控制反转(IoC)与依赖注入(DI)
控制反转的目的很简单,即”解耦“
下面用一个打印示例来说明:

func Greet(name string) {
    fmt.Printf("Hello, %s", name)
}

那么我们该如何测试它呢?调用 fmt.Printf 会打印到标准输出,用测试框架来捕获它会非常困难。
我们所需要做的就是注入(这只是一个等同于「传入」的好听的词)打印的依赖。
我们的函数不需要关心在哪里打印,以及如何打印,所以我们应该接收一个接口,而非一个具体的类型。
如果我们这样做的话,就可以通过改变接口的实现,控制打印的内容,于是就能测试它了。在实际情况中,你可以注入一些写入标准输出的内容。

如果你看看 fmt.Printf 的源码,你可以发现一种引入(hook in)的方式:

// It returns the number of bytes written and any write error encountered.
func Printf(format string, a ...interface{}) (n int, err error) {
    return Fprintf(os.Stdout, format, a...)
}

有意思!在 Printf 内部,只是传入 os.Stdout,并调用了 Fprintf。
os.Stdout 究竟是什么?Fprintf 期望第一个参数传递过来什么?

func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error) {
    p := newPrinter()
    p.doPrintf(format, a)
    n, err = w.Write(p.buf)
    p.free()
    return
}

io.Writer 是:

type Writer interface {
    Write(p []byte) (n int, err error)
}

如果你写过很多 Go 代码的话,你会发现这个接口出现的频率很高,因为 io.Writer 是一个很好的通用接口,用于「将数据放在某个地方」
所以我们知道了,在幕后我们其实是用 Writer 来把问候发送到某处。我们现在来使用这个抽象,让我们的代码可以测试,并且重用性更好。

依赖注入的作用

引用


欢迎大家关注我的公众号


半亩房顶
上一篇 下一篇

猜你喜欢

热点阅读