依赖注入依赖注入(Dependency Injection)是一种鼓励模块化的软件工程范式,是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。而通过模块与模块的依赖做解耦,有利于:

模块更加“独立”模块与模块之间“独立”,方便分团队开发模块可以更容易的被其它程序调用,方便构造高度复杂的程序模块更容易被测试上述就是依赖注入的目的,它其实是独立于依赖注入的实现。

更加具体的说,是否使用反射,是否支持在运行时通过修改配置来替换依赖的等等,是属于具体依赖注入实现的特性;它们其实无关于依赖注入范式的考量。

使用依赖注入是为了让程序可以更好模块化管理,将模块与依赖解耦,以便于测试,构造高度复杂的程序;而不是为了在运行时通过修改配置来替换依赖实现。

换句话说,如果我们开发的程序足够简单,那么是没有必要去使用依赖注入范式的;但如果我们开发的是一款高度复杂、需要多团队配合的程序,类似依赖注入这样的范式,则显得必不可少。

Go语言那么go语言是否需要依赖注入?

显然需要,比方说,谷歌开源的go-cloud,这个支持跨云服务商的SDK,便是例子;其团队为了使用依赖注入范式,也顺带开源了wire:一个基于编译时、代码生成实现的依赖注入框架。

Go对独特的语言特性其实不是内置支持goroutine(协程在很多语言其实都有内置或者类库层面的支持),而是其interface接口,在go语言里面,接口的定义可以迟于实现。

开发go程序的时候,我们可以直接编写struct的实现,而无需关心,甚至无法关心具体struct实现了哪些接口。什么样的函数签名组合才构成一个接口,在go语言里面可以是取决于类库、模块的使用者,而不是实现者。

Go语言的接口可以迟于struct实现来定义这一独一无二的语言特性,使得我们在使用依赖注入的时可以先方便的注入具体类型;而在后续需要扩展为“接口”,提供多个实现的时候,无需修改模块代码。

可以说,go语言与依赖注入范式是相当绝妙的搭配。

总结Go语言的interface的特性使得在很多情况下,依赖注入变得没有如Java等语言中重要。然而,依赖注入在一些复杂的场景中也有用武之地,go与依赖注入仍有很大的研究空间。

为什么有很多人说Go语言不需要依赖注入?  Golang 第1张