Friday, December 3, 2021
HomeCrypto MiningClear Structure template for Golang providers by Evrone

Clear Structure template for Golang providers by Evrone

Go-clean-template is a Golang template venture based mostly on Robert “Uncle Bob” Martin’s Clear Structure ideas, prepared so that you can clone and use as a place to begin to your subsequent Golang app.

The Clear Structure

The Clear Structure is a manner of arranging advanced — or potentially-complex — methods which, like most good units of architectural ideas, promotes a strict separation of issues.

That’s, software program is damaged down into unbiased practical elements which interface with each other solely via well-defined and dependable means, with solely the state and assets which must be exchanged with a purpose to carry out the duty at hand handed between them.

A strict separation of issues may help minimise the complexity of every element, decreasing the chance of bugs being launched, and making them simpler to repair once they do come up — supplied the offending element will be readily recognized. A separation of issues is vital to adhering to the least privilege safety precept.

The Clear Structure achieves this separation of issues via conventions (guidelines) which make it clear the place inside the structure an entity, element, or a part of a element exists, and the extent to which every is seen and accessible to different elements of the system.

For instance, the high-level enterprise enterprise guidelines of a system can not, for those who conform to the Clear Structure ideas, have direct entry to information buildings handed between an API server and a cell app, nor even have consciousness that such particulars exist — though their content material can in fact be handed via the layers from the low-level elements to the upper ones via well-defined means if that’s required performance.

After all, like all architectural foundations, the Clear Structure is a framework that you must select to stick to all through the lifecycle of a chunk of software program, it will not bodily forestall you from writing poor code. Hopefully, although, beginning with this template will assist you to begin as you imply to go on!


Fast Begin

As soon as you’ve got checked out the template, you’ll be able to dive into inner and begin writing code. The supplied Makefile has a lot of targets for constructing and working your app, however essentially the most helpful ones are:

Run with Docker (begins Postgres and RabbitMQ):

$ make compose-up

Run regionally with migrations:

$ make run

Run integration exams with Docker:

$ make compose-up-integration-test

Venture Construction

Full particulars are included within the venture’s README, however some areas of explicit curiosity embrace:


Configuration and logger initialisation, earlier than management is handed to Run in inner/app/app.go.


The Run operate (invoked by Primary) in app.go performs object initialisation and dependency injection (extra on this under), begins the server, and waits till it is time to gracefully terminate.

The migrate.go file is used for database auto migrations. It’s included if an argument with the migrate tag is specified. For instance: 

$ go run -tags migrate ./cmd/app


Server handler layer (MVC controllers). The template contains two servers:

  • RPC (RabbitMQ as transport)
  • REST HTTP (Gin framework)

Server routers are written in the identical model:

  • Handlers are grouped by space of utility
  • For every group, its personal router construction is created, the strategies of which course of paths
  • The construction of the enterprise logic is injected into the router construction, which will probably be referred to as by the handlers


Enterprise logic fashions which are frequent to the system and can be utilized in any layer.


Enterprise logic.

  • Strategies are grouped by space of utility (on a typical foundation)
  • Every group has its personal construction
  • One file – one construction


Utility configuration. Surroundings variables will override configuration file values. Configuration choices with the tag 'env-required: true' in config.go are required, and a price have to be supplied in both config.yml, the atmosphere, or each.


Swagger documentation. That is auto-generated by swag library, so do not make any adjustments, as they’re going to be misplaced.


Integration exams. They’re launched as a separate container, subsequent to the applying container. It’s handy to check the Relaxation API utilizing go-hit.

Dependency Injection

We make use of dependency injection with a purpose to allow a weak coupling between elements and minimise direct dependencies.

For instance, via the NewService constructor, we inject the dependency into the construction of the enterprise logic. This makes the enterprise logic unbiased (and moveable). We are able to override the implementation of the interface with out making adjustments to the service package deal.

package deal usecase

import (
    // Nothing!

kind Repository interface {

kind UseCase struct {
    repo Repository

func New(r Repository) *UseCase {
    return &UseCase{
        repo: r,

func (uc *UseCase) Do()  {

This additionally permits us to auto-generate mocks (for instance with mockery) and simply write unit exams.

We aren’t tied to particular implementations with a purpose to all the time have the ability to change one element to a different. If the brand new element implements the interface, nothing must be modified within the enterprise logic.

For those who discover that you must managing a lot of injections, wire is a well-liked selection.

Various tasks

After all ours is not the one Clear Structure template for Golang, so you could have an interest to discover these alternate options and select the one which fits you greatest:

  • go-clean-arch
  • courses-backend

Our work on open-source tasks proves our initiative & understanding of what builders love and want. Attain out to us by way of the kind under if you have to replace your venture to the newest variations of the know-how stack!



Please enter your comment!
Please enter your name here

Most Popular

Recent Comments