Golang DIG - Managing Dependencies Made Easier

Golang DIG - Managing Dependencies Made Easier

What is Golang Dig

In the Go programming language, the "dig" package is a valuable tool for managing dependencies in code. This package offers a dependency injection (DI) container that simplifies the process of declaring and injecting dependencies, making it easier to refactor code and add new dependencies without changing existing code.

The "dig" package provides two embedded types, dig.In and dig.Out, which facilitates the declaration and retrieval of dependencies from the container. The dig.In type is used to declare dependencies, while the dig.Out type is used to request dependencies.

Dependency injection Golang

Furthermore, the "dig" package supports optional dependencies, which are declared by adding the tag optional:true to fields in a dig.In struct. If a dependency is not available in the container, the constructor will receive a zero value for the field. Constructors that declare optional dependencies must handle the case of those dependencies being absent.

The "dig" package also includes value groups, allowing constructors to send values to a named, unordered collection in the container. Other constructors can request all values in this collection as a slice. Constructors can send values into value groups by returning a dig.Out struct tagged with group:"..". Multiple constructors can provide values to this named collection. Other constructors can request all values for this collection by requesting a slice tagged with group:"..".

While some developers may prefer not to use a DI library, arguing that Go is intended to be a straightforward language and that a DI library can make DI too abstract and magical. However, for developers who need more advanced DI features, Go's built-in DI capabilities may not be adequate, and they may opt to use a DI library like "dig" or Google's "Wire."

In summary, the "dig" package in Go provides a powerful way to manage dependencies in code by declaring and injecting them using a DI container. With its support for optional dependencies and value groups, it makes adding and requesting dependencies easier. Although some developers may not prefer to use a DI library, others may find it helpful.

Useful links about Goland Dig

https://github.com/uber-go/dig

https://pkg.go.dev/go.uber.org/dig

https://en.wikipedia.org/wiki/Dependency_injection

https://go.dev/

Related articles

Ruslan Osipov
Written by author: Ruslan Osipov