Our next pattern is called chain of responsibility. As its name implies, it consists of a chain and, in our case, each link of the chain follows the single responsibility principle.
The single responsibility principle implies that a type, function, method, or any similar abstraction must have one single responsibility only and it must do it quite well. This way, we can apply many functions that achieve one specific thing each to some struct, slice, map, and so on.
When we apply many of these abstractions in a logical way very often, we can chain them to execute in order such as, for example, a logging chain.
A logging chain is a set of types that logs the output of some program to more than one
io.Writer interface. We could have a type that logs to the console, a type that logs to a file, and a type that logs to a remote server. You can make three calls every time you want to do some logging, but it's more elegant to make only one and provoke...