The purpose of this architecture is to be as flexible as possible in order to develop a project as quickly as possible and to maintain this speed during the whole development lifespan, whatever its size and the changes that will have to be done, for whatever reason.
run main_test.go and read the logs to see
- how the execution flows from a layer to another while the dependency inversion rule is strictly observed.
- how an Interface can be substituted to another allowing us to plug IN/OUT dependencies