When you initially start a Go project, your main function typically has a bunch of wiring code – initialising your routes, plugging in middlewares, initialising your template engines, loggers, etc.

This is one of the great things about Go – you don’t have any magic happening behind the scenes. The code is all there and you can read it and debug it.

But as your software grows, you start feeling the growing pains – your main function starts becoming more and more convoluted. You start having all sorts of small bits and pieces plugged in here and there – healthchecks, database setup code, metrics, tracers, external API connections, etc etc.

And what if your application grows into a microservice architecture? What do you do when you have five different microservices demanding the same bunch of setup code, specific to your environment?

In this article, I will introduce you to Fx. It’s a Go framework which solves both problems outlined above using dependency injection.

Let’s jump in.

All the code from this article is available in this repo.

Continue reading